在 iOS5 中未调用 UIViewController 设备旋转委托方法

Posted

技术标签:

【中文标题】在 iOS5 中未调用 UIViewController 设备旋转委托方法【英文标题】:UIViewController device rotation delegate methods are not getting called in iOS5 【发布时间】:2011-09-16 13:51:56 【问题描述】:

我正在开发一个 iPhone 应用程序。在这个应用程序中,UIViewController (vc1) 呈现了另一个 UIViewController (vc2)。 vc1 支持纵向和横向方向; vc2 仅支持纵向。

    当 vc2 出现时,它会询问 vc1: shouldAutorotateToInterfaceOrientation: 并返回 YES 在 ios5(Beta 7)中,willRotateToInterfaceOrientation:、didRotateFromInterfaceOrientation: 没有被调用这个序列。但是,这在 iOS4 中运行良好。这是 iOS5 的错误吗?

【问题讨论】:

【参考方案1】:

我向 Apple 报告了一个错误,我得到了以下回复:

“工程部门根据以下信息确定此问题的行为符合预期:

演示行为是正确的 - 如果它在以前的版本中表现不同,那是一个错误。可以说是出乎意料的行为变化与 VC1 的解除有关,它不再获得旋转回调,但它将纵向布局。

当视图控制器自行布局时,还有其他方法可以确定您的方向。由于各种原因,依赖轮换回调被证明是有问题的。

一般来说,viewController旋转回调有两种情况:

    窗口层次结构中视图控制器的设备方向发生变化 混合界面方向演示。 (底部控制器仅支持纵向,设备处于横向,并提供了支持横向的视图控制器。)然而,这可以说是一个错误。

尝试在 iOS 5 中使用 viewWillLayoutSubviews:。”

【讨论】:

你是如何解决这个问题的?我在 iOS 8 beta 5 中遇到了同样的问题。【参考方案2】:

我在 iOS5 上测试我的应用时遇到了类似的问题。如果在模态视图控制器处于活动状态时方向发生变化,则主视图控制器中子视图的布局会变得混乱。

我所做的是将当前方向标志存储在主控制器中。这个标志在主控制器的两个地方更新

    willAnimateRotationToInterfaceOrientation: viewWillLayoutSubviews(仅适用于 iOS5)

我编写了所有逻辑来通过比较当前方向和存储的值来调整子视图。如果它们不同 - 更新存储的方向,更新您的子视图。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    
    // Any orientation is OK
    return YES;


- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

    portrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation);

    // Code to update subview layout goes here


-(void)viewWillLayoutSubviews

    BOOL isPortraitNow = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);

    if(isPortraitNow != portrait)
            
        DLog(@"Interfaceorientation mismatch!, correcting");

        portrait = isPortraitNow;

        // Code to update subview layout goes here
    

【讨论】:

以上是关于在 iOS5 中未调用 UIViewController 设备旋转委托方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从情节提要中获取 UIViewControl 对象的笔尖名称

在 Xcode 4.2 中未检测到具有 iOS 5.0.1 的设备

ios5:停止视图被卸载/停止 viewDidUnload 被调用

viewDidAppear 未调用但 viewWillAppear 调用仅出现在 iOS5

UIViewControl之间的七种传值方式

在 useEffect() 中未调用函数