【问题标题】:How to properly rotate viewcontrollers in UINavigationController?如何正确旋转 UINavigationController 中的视图控制器?
【发布时间】:2013-10-12 13:30:07
【问题描述】:

我有一个 UINavigationController,它的视图嵌入到 UIViewController 中。当我旋转设备时,NavigationController 完美地接收到了willRotatedidRotate 事件。但是,在 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];
    } 
}

【问题讨论】:

    标签: ios uiviewcontroller uinavigationcontroller rotation


    【解决方案1】:

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

    [yourParentViewController addChildViewController:yourNavigationController];
    

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

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

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

    【讨论】:

    • 谢谢 Andreas,我已经将 navigationController 添加到 parentViewController。当轮换发生时它会收到通知。但是只通知导航控制器可见的viewController。
    • @frankish 如何通知?我创建了一个复制您的案例的测试项目,并且自动布局一直运行良好(使用 autoresizingMasks 或UIView 的layoutSubviews 方法时)。
    • 当设备旋转到横向模式时,我将一些按钮从屏幕底部移动到右上角。但是,如果我在旋转设备之前按下其他一些视图控制器,在旋转之后,我会通过弹出当前视图控制器返回到上一个视图控制器,并且我看到视图控制器没有将我的按钮移动到右上角,因为我在“willRotate”功能上手动执行此操作。但是如果我在该视图控制器可见时进行相同的旋转。一切正常。
    • @frankish 不要在willRotate 中这样做。如果必须在UIViewController 中进行,请在方法viewDidLayoutSubviews 中进行。
    • 请您用您最后的评论更新答案,因为它有效(:
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      相关资源
      最近更新 更多