在 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 被调用