在 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 7 中处理界面旋转

如何在一个视图不应该自动旋转而一个视图应该自动旋转的 iOS 应用程序中处理自动旋转?

处理旋转时更改的 iOS 键盘布局

在 ios 中,视图控制器中移动子视图以处理旋转的正确位置在哪里?

MKMapView 在 iDevice 上停止响应