我的root视图控制器的supportedInterfaceOrientations的实现几乎总是返回UIInterfaceOrientationMaskAll,但是有一个边缘情况,它返回UIInterfaceOrientationMaskLandscape.
如果用户旋转设备,这是正常的.但是,如果设备保持在纵向模式,则supportedInterfaceOrientations方法不会被调用,除非用户手动旋转设备.
我如何以编程方式告诉系统此方法的返回值已更改?
根据文档,似乎我应该能够调用[UIViewController attemptRotationToDeviceOrientation],但是这没有任何效果(supportedInterfaceOrientations从不被调用,屏幕不旋转).
我发现其他人已经发布了各种解决方法来尝试解决这个问题,但是没有人在我的测试中工作.我怀疑他们可能在iOS 5.0中工作,但不是iOS 6.0.
我在根视图控制器的shouldAutorotate方法中返回YES.
解决方法
首先,如果您要以横向模式呈现您的UIViewController,则可能会有用.
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight; }
另外,很多依赖于你的UIViewController嵌入在哪个控制器中.
例如,如果在UINavigationController内部,那么您可能需要将该UINavigationController子类化以覆盖这样的方向方法.
子类UINavigationController(层次结构的顶层viewcontroller将控制方向).需要将其设置为self.window.rootViewController.
- (BOOL)shouldAutorotate { return self.topViewController.shouldAutorotate; } - (NSUInteger)supportedInterfaceOrientations { return self.topViewController.supportedInterfaceOrientations; }
从iOS 6起,UINavigationController不会要求其UIVIewControllers进行定向支持.因此,我们需要对它进行子类化.
注意 :
每当Push操作完成时,将始终调用shouldAutorotate和supportedInterfaceOrientations方法调用UINavigationController.