1

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

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

2 回答 2

0

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
       return YES;
} 
于 2013-10-05T17:31:15.073 回答
0

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

[yourParentViewController addChildViewController:yourNavigationController];

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

然后你可以简单地在UIViewController'sviewDidLayoutSubviews方法中进行布局(或者如果你有一个子类视图,在它的layoutSubviews方法中)。

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

于 2013-10-05T17:35:36.427 回答