3

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

   -(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";
    }
}
4

1 回答 1

3

您的 pagecurl 没有随设备旋转。

这是因为它的视图没有随着设备旋转而旋转。

是因为它的视图是视图层次结构中的最顶层视图。

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

这是一件很容易验证的事情,只需记录视图的框架和边界并观察旋转时会发生什么。

在这里,我们处于肖像模式。我已经设置了一个包含在 self.view 中的子视图,具有相同的尺寸。

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}

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

我们显然不想依赖报告这种奇怪结果的视图的几何属性。我想这与 Apple 的警告有关,即如果视图的框架经过身份变换以外的任何变换,则不应引用它。

解决方案是将您的页面卷曲视图嵌入到另一个最外层视图中。创建一个新视图,将其命名为 self.subview(或其他),并将其作为 self.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"];

然后您的卷发将按您的预期运行,因为您将它们应用到一个按您预期旋转的视图。

您可以在不更改代码的情况下获得相同的结果,但将 viewController 嵌入 UINavigationViewController。在这种情况下,NavViewController 的视图是不旋转的最外层视图。所以你的 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>>

注意变换。

于 2013-01-10T06:17:13.480 回答