如何在UINavigationController中正确旋转viewcontrollers?

时间:2013-10-05 16:32:03

标签: ios uiviewcontroller uinavigationcontroller rotation

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

问题在于: 虽然第二个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];
    } 
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

[yourParentViewController addChildViewController:yourNavigationController];

这将确保您的导航控制器收到有关布局更改的通知,并将此信息传递给其所有视图控制器。

然后,您只需在UIViewController的{​​{3}}方法中进行布局(或者如果您的layoutSubviews方法中有子类视图。

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