gpt4 book ai didi

page-curl - CATransition 不考虑 iPad 上的方向变化

转载 作者:行者123 更新时间:2023-12-02 00:15:36 24 4
gpt4 key购买 nike

我有一个正常工作的页面 curl 。问题是 iPad 的旋转。该应用程序仅横向运行,支持 l 左和 l 右。如果 iPad 是“横向右”,则 curl 会出现在右下角。如果我旋转 iPad, View 会按预期旋转,但现在当我尝试时, curl 发生在左上角。我添加了一个通知,告诉我它何时旋转并尝试更改动画子类型但没有骰子。

   -(IBAction)curlViewUp
{
uiv_help.alpha = 1.0;

[UIView animateWithDuration:1.0
animations:^{
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setDuration:0.7];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
animation.type = @"pageCurl";
animation.subtype = curlDirection;
animation.fillMode = kCAFillModeForwards;
animation.endProgress = 0.20;
[animation setRemovedOnCompletion:NO];
[self.view.layer addAnimation:animation forKey:@"pageCurlAnimation"];
[self.view addSubview:uiv_help];
;}
];
}

-(IBAction)curlViewDown
{
uiv_help.alpha = 0.0;

[UIView animateWithDuration:1.0
animations:^{
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setDuration:0.7];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
animation.type = @"pageUnCurl";
animation.subtype = curlDirection;
animation.fillMode = kCAFillModeForwards;
animation.startProgress = 0.80;
[animation setRemovedOnCompletion:YES];
[self.view.layer addAnimation:animation forKey:@"pageUnCurlAnimation"];
//[self.view removeFromSuperview];
[uiv_help removeFromSuperview];
;}
];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft | interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

-(void)checkRotation:(NSNotification*)notification
{
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if(orientation == UIInterfaceOrientationLandscapeLeft)
{
NSLog(@"UIInterfaceOrientationLandscapeLeft");

curlDirection = @"fromRight";
} else if (orientation == UIInterfaceOrientationLandscapeRight) {
NSLog(@"UIInterfaceOrientationLandscapeRight");

curlDirection = @"fromRight";
}
}

最佳答案

您的 pagecurl 没有随设备旋转。

这是因为它的 View 不随设备旋转而旋转..

这是是因为它的 View 是 View 层次结构中最顶层的 View 。

我在任何地方都找不到这方面的文档(其他人可以挖掘出来吗?),但是 View 层次结构中最外面的 View 不会旋转。我想那是因为正是这个 View 负责旋转其他所有内容(或者更确切地说,这个 View 应用了某种旋转变换)。

验证起来很简单,只需记录 View 的框架和边界并观察旋转时发生的情况。

这里是肖像模式。我已经设置了一个包含在 self.view 中的 subview ,具有相同的尺寸。

self.view frame {{0, 20}, {768, 1004}}
self.view bounds {{0, 0}, {768, 1004}}
self.view center {384, 522}
--------
self.subview frame {{0, 0}, {768, 1004}}
self.subview bounds {{0, 0}, {768, 1004}}
self.subview center {384, 502}

现在让我们旋转到横向

self.view frame {{20, 0}, {748, 1024}}
self.view bounds {{0, 0}, {1024, 748}}
self.view center {394, 512}
--------
self.subview frame {{0, 0}, {1024, 748}}
self.subview bounds {{0, 0}, {1024, 748}}
self.subview center {512, 374}

您会看到内部 subview 正确报告宽度为 1024 和高度为 748 像素。但是外面的景色变得很奇怪。它的框架报告宽度为 748,高度为 1024,就好像它仍然是纵向的(加上状态栏 20px)。但它的界限告诉我们它是风景。

我们显然不想依赖报告这种奇怪结果的 View 的几何属性。我想这与 Apple 的警告有关,即如果 View 的框架受到除恒等变换之外的任何变换,则不应引用 View 的框架。

解决方案是将您的 pagecurling View 嵌入到另一个最外层的 View 中。创建一个新 View ,将其命名为 self.subview(或其他名称),并将其作为 self.view 的唯一 subview 添加到您的 View 层次结构中。将其调整为与 self.view 相同的矩形。在 self.subview 而不是 self.view 上操作。

改变这一行:

[self.view.layer addAnimation:animation forKey:@"pageCurlAnimation"];

[self.subview.layer addAnimation:animation forKey:@"pageCurlAnimation"];

并更改这一行:

[self.view.layer addAnimation:animation forKey:@"pageUnCurlAnimation"];

到:

[self.subview.layer addAnimation:animation forKey:@"pageUnCurlAnimation"];

然后您的 curls 将按预期运行,因为您将它们应用到按预期旋转的 View 。

您可以在不更改代码的情况下获得相同的结果,但将您的 viewController 嵌入到 UINavigationViewController 中。在那种情况下,NavViewController 的 View 是不旋转的最外面的 View 。所以你的 self.view 会旋转。

更新

UIWindow* mWindow = [[UIApplication sharedApplication] keyWindow];
UIView *topView = [[mWindow subviews] lastObject];
NSLog("%@",topView);


topView <UILayoutContainerView: 0x71eb450;
frame = (0 0; 748 1024);
transform = [0, 1, -1, 0, 0, 0];
autoresize = W+H; gestureRecognizers = <NSArray: 0x71f8a30>;
layer = <CALayer: 0x71eb540>>

注意变换。

关于page-curl - CATransition 不考虑 iPad 上的方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13367022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com