【问题标题】:Prevent autorotate for one view controller?防止一个视图控制器自动旋转?
【发布时间】:2013-02-21 14:07:34
【问题描述】:

我的应用可以自动旋转,但我需要其中一个视图仅以纵向模式显示,并且不知道如何实现。

我尝试了这个(除其他外),但有问题的视图仍然旋转:

//  ViewController.m

-(BOOL)shouldAutorotate
{            
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

有人可以指出我做错了什么吗?谢谢。

-编辑-

适用于 iOS 6.1

【问题讨论】:

标签: ios objective-c uiviewcontroller ios6 autorotate


【解决方案1】:

当涉及UINavigationController 时,在UINavigationControlleroverride supportedInterfaceOrientations 上创建一个类别。

#import "UINavigationController+Orientation.h"

@implementation UINavigationController (Orientation)

- (NSUInteger)supportedInterfaceOrientations {
   return [self.topViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate {
    return YES;
}

@end  

现在,iOS 容器(例如 UINavigationController)不会咨询它们的子容器来确定它们是否应该自动旋转。

如何创建类别
1.添加一个新文件(cocoa touch下Objective c-category)
2. Category : UINavigationController 上的方向
3、将以上代码添加到UINavigationController+Orientation.m

【讨论】:

  • 是的,有一个 UINavigationController 参与其中,但我不得不承认我不知道您所说的子类化究竟是什么意思,但我会去读一读。
  • @Robert 只需在UINavigationController 上添加一个类别即可查看我的编辑
  • 这也适用于父级 UITabBarController
  • 为什么不继承和覆盖? Apple 说:避免 Category Method Name Clashes ..如果在一个类别中声明的方法的名称与原始类中的方法相同,或者同一类(甚至超类)上的另一个类别中的方法,则行为未定义在运行时使用哪种方法实现。如果您在自己的类中使用类别,这不太可能成为问题,但在使用类别向标准 Cocoa 或 Cocoa Touch 类添加方法时可能会导致问题。
【解决方案2】:

Swift 3 版本接受的答案:

extension UINavigationController {

    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        // Change `.portrait` to whatever your default is throughout your app
        return topViewController?.supportedInterfaceOrientations ?? .portrait
    }

    open override var shouldAutorotate: Bool {
        return true
    }
}

【讨论】:

    【解决方案3】:

    根据documentation

    视图控制器可以覆盖supportedInterfaceOrientations 方法来限制支持的方向列表。

    所以我们需要覆盖shouldAutorotatesupportedInterfaceOrientation 来定位view controllers

    通常,系统仅在窗口的根视图控制器或呈现为填满整个屏幕的视图控制器上调用此方法。

    如果您有非常简单的配置,例如您的目标 view controllerwindowrootViewController 或被呈现为覆盖整个屏幕,这将起作用。

    如果目标视图控制器的配置很复杂,比如嵌入在其他一些容器视图控制器中。

    子视图控制器使用其父视图控制器为它们提供的窗口部分,不再直接参与有关支持哪些旋转的决策。

    因此,这些容器视图控制器的默认实现可能不会向那里的孩子询问 supportedInterfaceOrientation 偏好。

    所以为了让我们的目标child view controller 指定supportedIntefaceOrientation,我们需要告诉容器视图控制器这样做。

    你也可以查看我之前的回答here

    Understanding UIViewController rotation when embed in Container View Controllers.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多