当子视图控制器呈现时,父视图控制器不会旋转。

4

我是一个支持所有四个方向的父视图控制器。它会呈现子视图控制器,如果在子视图控制器呈现时旋转设备,然后关闭子视图控制器,父视图控制器不会正确地旋转。以下是我在父视图控制器中使用的旋转代码:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {

    newestIssueCoverImageButton.frame = CGRectMake(40, 20, 688, 865);
    shadow.frame = CGRectMake(40, 20, 688, 865);
    recordView.frame = CGRectMake(0, 44, 768, 916);
    classifiedsWebView.frame = CGRectMake(0, 44, 768, 916);

} else {

    newestIssueCoverImageButton.frame = CGRectMake(269, 20, 486, 613);
    shadow.frame = CGRectMake(269, 20, 486, 613);
    recordView.frame = CGRectMake(0, 44, 1024, 660);
    classifiedsWebView.frame = CGRectMake(0, 44, 1024, 660);

}

父视图看起来好像这段代码并没有被调用,只是我旋转了设备。我该如何调用这段代码,并确保当用户正在查看子视图时,父视图控制器的旋转正确?谢谢您的帮助。

3个回答

9

根据苹果文档:

如果视图控制器在方向更改时不可见,则旋转方法从未被调用。但是,当视图变为可见时,将调用viewWillLayoutSubviews方法。您可以调用statusBarOrientation方法来确定设备的方向。

我添加了一个BOOL来跟踪它是否为顶层viewController,然后:

- (void)viewWillLayoutSubviews {

    if (notTopController) {

        [self willRotateToInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation] duration:0];
        [self willAnimateRotationToInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation] duration:0];

       notTopController = NO;

}

目前对我来说运行良好。


我不得不为我的情况进行适应(我有一个容器视图控制器,其大小没有正确调整),但这里的基本逻辑是正确的。 - Chris Prince

2
shouldAutorotateToInterfaceOrientationwillRotateToInterfaceOrientationRotateToInterfaceOrientation只在当前/可见的视图控制器上调用,而不是在堆栈中“后面”的视图上调用。在您的情况下,当子视图可见时,它会在子视图上调用,但不会在父视图上调用。
如果发生了旋转事件,则在解除子视图控制器(假设您正在使用NavigationController)时,shouldAutorotateToInterfaceOrientation将在父级上调用(但不是will/didRotate)。如果您想亲自了解,请在所有这些方法中添加一些NSLog()语句。
知道了这些,一个快速的解决方法是将您的调整大小代码放入shouldAutorotateToInterfaceOrientation中。

谢谢你的帮助和解释。我会尝试一下。顺便说一句,我看了你的个人资料,你的Trakr应用程序真的很酷。 - Jack Humphries
shouldAutorotateToInterfaceOrientation现已被弃用。请参见https://developer.apple.com/documentation/uikit/uiviewcontroller/1621459-shouldautorotatetointerfaceorien。 - Chris Prince

0

请确保父视图控制器子视图控制器都支持旋转。使用shouldAutorotateToInterfaceOrientation:方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接