【问题标题】:"didRotateFromInterfaceOrientation:" not called“didRotateFromInterfaceOrientation:”未调用
【发布时间】:2011-10-11 11:08:07
【问题描述】:

嗨,我正在准备在主视图的小视图中添加子视图控制器视图 但是 didRotateFromInterfaceOrientation:.没有调用子控制器的,所以我无法对方向的变化进行任何更改

【问题讨论】:

    标签: objective-c ipad uiinterfaceorientation addsubview


    【解决方案1】:

    didRotateFromInterfaceOrientation 仅在您将 childViewController 添加到 parentViewController 时才会被调用(在 childViewController 中):

    [parentViewController addChildViewController:childViewController];
    

    请注意,您仍然可以使用属性打开/关闭该行为:

    self.automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers

    它默认设置为YES,所以在你的情况下你不需要触摸它。 iOS 6.0 后弃用 干杯

    【讨论】:

    • 现在自动ForwardAppearanceAndRotationMethodsToChildViewControllers 已被弃用。在 iOS 7 中你必须使用这个:-(BOOL)shouldAutomaticallyForwardRotationMethods { return YES; }
    【解决方案2】:

    您是否有超过 1 个 UIViewController 同时在屏幕上主动显示其视图? iOS 真的只希望一次在屏幕上出现 1 个属于 UIViewController 的视图。如果超过 1 个,则只有全屏视图的 UIViewController 会调用其方向更改方法。

    【讨论】:

      【解决方案3】:

      我只是想对这个问题进行跟进。在 iOS 8 之后,旋转方法已被弃用,而是在子视图控制器中覆盖 viewWillTransitionToSize()。

      注意:此方法似乎需要您按上述方式添加子视图控制器。我使用故事板和 NavigationController 构建了我的测试,并在按下按钮时推送了一个新的视图控制器。

      我在这个函数上设置了一个断点,当我使用调试器检查时:self->parentViewController->childViewControllers,childViewControllers 为 nil。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。基本上是

        didRotateFromInterfaceOrientation:
        

        为根/父视图控制器调用,如果您希望为视图控制器调用此方法,那么它必须是当前根视图控制器的子视图控制器。

         [self addChildViewController:YourUIViewController];
        

        【讨论】:

          【解决方案5】:

          根据 Apple 文档“当可见视图控制器发生旋转时,将在旋转过程中调用 willRotateToInterfaceOrientation:duration:、willAnimateRotationToInterfaceOrientation:duration: 和 didRotateFromInterfaceOrientation: 方法。在调整视图大小后还会调用 viewWillLayoutSubviews 方法由其父级定位。如果发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图可见时会调用 viewWillLayoutSubviews 方法。您的此方法的实现可以调用 statusBarOrientation 方法确定设备方向。”

          但实际上,即使视图可见,由于某种原因(可能是因为视图没有占据全屏?),相应的视图控制器的旋转相关委托方法也不会被调用。 在某些情况下,覆盖 -viewWillLayoutSubviews 可能是一种解决方法。

          【讨论】:

            【解决方案6】:

            这是控制器的寿命问题。我怀疑您实例化了控制器并添加了子视图然后释放了实例。现在,如果您正在旋转设备,则不会调用添加的子视图旋转委托方法。

            第二个原因是每当您添加子视图时,只会调用父视图委托,因为调用者只有父视图控制器的实例。调用者可能是导航控制器(基于导航的应用程序)、选项卡控制器(在基于选项卡的应用程序的情况下)。如果你想在轮换中调用 subview 方法,你需要像下面这样显式调用它:

            if(subviewController != nil){
            
              if([subviewController respondToSelector(rotateMethodOfSubView:)])
            
                 [subViewController performSelector(rotateMethodOfSubView:) withObject: self];
            
            } 
            

            这应该有助于解决问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-26
              • 1970-01-01
              • 2012-02-10
              • 2014-07-27
              相关资源
              最近更新 更多