在 iOS 6 上处理 iDevice 旋转
Posted
技术标签:
【中文标题】在 iOS 6 上处理 iDevice 旋转【英文标题】:Handling iDevice rotation on iOS 6 【发布时间】:2012-09-27 01:31:34 【问题描述】:我无法弄清楚如何在 ios 6 上处理设备旋转。当设备旋转时,我有三件事需要单独更改。
我有一个父 UIViewController 来处理多个子 UIViewControllers 或 UINavigationControllers(它基本上是一个自定义的 UITabBarController)。我不希望这个旋转。 这些子视图控制器中的每一个都将根据自己的设置旋转或不旋转。 (我希望一些旋转,一些不旋转)。 在标签栏中,我希望每个标签图标(一个 UIView)旋转到方向。我将如何在 iOS 6 中实现这一点,我在 iOS 5 中一切正常。
这是我目前所拥有的:
在父 UIViewController 中:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
return UIInterfaceOrientationPortrait;
- (BOOL)shouldAutorotate
return NO;
- (BOOL)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
在子视图控制器中:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
return YES;
- (BOOL)shouldAutorotate
return YES;
- (BOOL)supportedInterfaceOrientations
return UIInterfaceOrientationMaskAll;
【问题讨论】:
查看我的帖子:***.com/a/12538622/1575017 我看到了你的帖子,这很有帮助。我添加了我认为正确的内容,但没有任何内容会旋转。我的 info.plist 文件支持所有方向。 你是用模拟器还是真机测试?我有时无法让模拟器在屏幕上旋转 UI。 HTH 模拟器。这可能可以解释为什么它不旋转。 好的,我修复了我的模拟器,它现在可以响应界面方向。我也弄清楚了为什么不起作用。在 iOS 6 上应该只在根视图控制器上调用 autorotate,并且它只会旋转到它支持的方向。 (忽略所有子视图响应)那么,我怎样才能覆盖此行为,并允许子视图旋转。 (主要是我只希望标签栏用主页按钮沿着边缘钉住。里面的图标随着方向的变化而旋转。) 【参考方案1】:要正确支持 iOS6,还有更多内容。 iOS 6 发行说明简要说明:
https://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html
这一点可能有用:
为了兼容性,仍然实现 shouldAutorotateToInterfaceOrientation: 方法的视图控制器不会获得新的自动旋转行为。 (换句话说,它们不会回退到使用应用程序、应用程序委托或 Info.plist 文件来确定支持的方向。)相反,shouldAutorotateToInterfaceOrientation: 方法用于合成将由 supportedInterfaceOrientations 方法返回的信息.
但您也应该看看 WWDC 2012 的 Session 236 - The Evolution of View Controllers。
【讨论】:
我也读过,但事实并非如此。我有 iOs 5 的折旧方法,但也调用了两个新方法……我刚刚进行了测试,并删除了新方法,现在一切正常。显然你必须实现其中一个。 是的,要么是旧方式,要么是新方式。您要么使用 shouldAutorotateToInterfaceOrientation (已弃用),要么完全取消它。 这不是它的工作方式。在 iOS 6 中,如果我删除了新的 iOS 6 方向方法,主视图和子视图会向任何方向旋转,而不管我在 iOS 5 方法中指定的内容。如果我添加上面的方法,什么都不会旋转。【参考方案2】:如果你想在导航堆栈中支持不同的方向,你必须先继承 UINavigationController 并覆盖supportedInterfaceOrientations。
- (NSUInteger)supportedInterfaceOrientations
//I want to support portrait in ABCView at iPhone only.
//and support all orientation in other views and iPad.
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
// find specific view which you want to control.
if ([[self.viewControllers lastObject] isKindOfClass:[ABCView class]])
return UIInterfaceOrientationMaskPortrait;
//support all
return UIInterfaceOrientationMaskAll;
【讨论】:
以上是关于在 iOS 6 上处理 iDevice 旋转的主要内容,如果未能解决你的问题,请参考以下文章
如何更改 iDevice (iPad/iPhone) 的方向?
如何在一个视图不应该自动旋转而一个视图应该自动旋转的 iOS 应用程序中处理自动旋转?