2013-10-05 35 views
0

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

这是问题: 虽然第二个viewController在navigationController中是可见的,但如果我旋转设备,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]; 
    } 
} 

回答

0

我不认为你需要任何轮换事件观察员。但是,UINavigationController中的UIViewController实例需要通知布局更改。

[yourParentViewController addChildViewController:yourNavigationController]; 

这将确保您的导航控制器得到通知,关于布局的变化,并传递给它的所有视图控制器这样的信息:这个,如果你添加UINavigationController到视图控制器层次自动发生。

然后,你可以简单地做你的布局UIViewControllerviewDidLayoutSubviews法(或者,如果你有一个子类的观点,在其layoutSubviews方法

注:以上这种方法需要iOS 5或更高

+0

谢谢Andreas,我已经将navigationController添加到parentViewController中,它会在轮换发生时得到通知,但只有通知导航控制器的可见viewController – frankish

+0

@frankish通知如何?我创建了一个复制您的案例的测试项目,并且自动布局一直在工作完美(使用自动更正时sizingMasks或'UIView'的'layoutSubviews'方法)。 –

+0

当设备旋转到横向模式时,我会从屏幕底部向右上方移动一些按钮。但是如果我在旋转设备之前推动其他viewcontroller,旋转之后,我通过弹出当前viewcontroller来回到前一个viewcontroller,并且我看到viewcontroller没有将我的按钮移动到右上角,因为我在“willRotate”函数上手动执行该操作。但是如果我在视图控制器可见的情况下做同样的旋转。一切都很完美。 – frankish

0

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
     return YES; 
} 
相关问题