Ios 如何在UINavigationController中正确旋转ViewController?

Ios 如何在UINavigationController中正确旋转ViewController?,ios,uiviewcontroller,uinavigationcontroller,rotation,Ios,Uiviewcontroller,Uinavigationcontroller,Rotation,我有一个UINavigationController,它的视图嵌入到UIViewController中。当我旋转设备时,NavigationController完美地接收到willRotate-didRotate事件。但是,在UINavigationController中的当前可见视图控制器之前推送的任何UIViewController都不会接收旋转事件 问题是: 当第二个viewController在navigationController中可见时,如果我旋转设备,viewController

我有一个UINavigationController,它的视图嵌入到UIViewController中。当我旋转设备时,NavigationController完美地接收到willRotate-didRotate事件。但是,在UINavigationController中的当前可见视图控制器之前推送的任何UIViewController都不会接收旋转事件

问题是: 当第二个viewController在navigationController中可见时,如果我旋转设备,viewController将根据旋转更改其布局。当我弹出viewcontroller返回第一视图控制器时,第一视图控制器根据纵向布局显示自己,因为它不调用旋转视图的重新布局方法

我不想为旋转更改添加观察者,因为它通常已经正常运行,因为默认的旋转方法通常会自动调用

在这种情况下我能做什么

我已经通过手动调用willRotate函数完成了,但我觉得这并不好

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    UIInterfaceOrientation io=[[UIApplication sharedApplication] statusBarOrientation];

    [self willRotateToInterfaceOrientation:io duration:0.3];

    for(int i=0;i<self.childViewControllers.count;i++){
        [[self.childViewControllers objectAtIndex:i]willRotateToInterfaceOrientation:io duration:0.3];
    } 
}

你提到的代码不正确。。我们不应该显式地调用委托方法。请在要具有自动旋转功能的ViewController中实现以下功能。您还可以通过检查允许的方向来限制基于所需方向的旋转

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
       return YES;
} 

我认为你不需要任何轮换事件观察员。但是,需要将布局更改通知UINavigationController中的UIViewController实例。如果将UINavigationController添加到视图控制器层次结构,则会自动发生此情况:

[yourParentViewController addChildViewController:yourNavigationController];
这将确保导航控制器收到布局更改的通知,并将此信息传递给其所有视图控制器

然后,您可以简单地在UIViewController的方法中进行布局,或者如果您有子类视图,则可以在其layoutSubviews方法中进行布局


注意:此方法需要iOS 5或更高版本

谢谢Andreas,我已经将navigationController添加到parentViewController。当旋转发生时,它会收到通知。但只通知导航控制器的可视viewController。@frankish如何通知?我已经创建了一个复制您的案例的测试项目,当使用autoresizingMasks或UIView的layoutSubviews方法时,autolayout工作得非常好。当设备旋转到横向模式时,我将一些按钮从屏幕底部移动到屏幕右上角。但是,如果在旋转设备之前按下其他viewcontroller,在旋转之后,通过弹出当前viewcontroller返回到上一个viewcontroller,我看到viewcontroller没有像我在willRotate功能上手动那样将按钮移动到右上角。但是如果我在视图控制器可见时进行相同的旋转。一切都很完美。@frankish不会用willRotate做的。如果必须在UIViewController中执行此操作,请在viewDidLayoutSubviews方法中执行此操作。请使用您最后的评论更新答案,因为它有效: