显示子视图控制器时,父视图控制器不会旋转

时间:2012-02-26 17:00:22

标签: iphone objective-c ios ipad uiviewcontroller

我有一个支持所有四个方向的父视图控制器。它显示一个子视图控制器,如果在显示子视图控制器时旋转设备,然后关闭子视图,则父视图控制器不能正确旋转。这是我在父视图控制器中用于旋转的代码:

- (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 个答案:

答案 0 :(得分:9)

来自Apple的文档:

  

如果在发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图变为可见时,将调用viewWillLayoutSubviews方法。您对此方法的实现可以调用statusBarOrientation方法来确定设备方向。

我添加了一个BOOL来跟踪它不是顶级viewController,然后是:

- (void)viewWillLayoutSubviews {

    if (notTopController) {

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

       notTopController = NO;

}

到目前为止对我有用。

答案 1 :(得分:2)

shouldAutorotateToInterfaceOrientationwillRotateToInterfaceOrientationRotateToInterfaceOrientation只能在当前/可见的视图控制器上调用,而不是在堆栈上“后面”的视图。在您的情况下,当孩子可见时,孩子会被调用,而父母则不会。

如果有旋转事件,当您关闭子视图控制器时(假设您使用的是NavigationController),将在父项上调用shouldAutorotateToInterfaceOrientation(但 {{ 1}})。如果您想亲眼看看,请在所有这些方法中抛出一些will/didRotate语句。

了解所有这些,快速解决方法是将调整大小的代码放入NSLog()

答案 2 :(得分:0)

确保两个父视图控制器和子视图控制器都支持旋转。的 shouldAutorotateToInterfaceOrientation: