我有一个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];
}
}
答案 0 :(得分:0)
您提到的代码不正确..我们不应该显式调用委托方法。请在您想要自动旋转功能的viewControllers中实现以下功能。您还可以通过检查允许的方向来限制基于您想要的方向的旋转。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
答案 1 :(得分:0)
我认为你不需要任何轮换事件观察员。但是,UIViewController
中的UINavigationController
个实例需要通知布局更改。如果将UINavigationController
添加到视图控制器层次结构中,则会自动执行此操作:
[yourParentViewController addChildViewController:yourNavigationController];
这将确保您的导航控制器收到有关布局更改的通知,并将此信息传递给其所有视图控制器。
然后,您只需在UIViewController
的{{3}}方法中进行布局(或者如果您的layoutSubviews
方法中有子类视图。
注意:此方法需要iOS 5或更高版本!