我的根 View Controller 的supportedInterfaceOrientations
实现几乎总是返回UIInterfaceOrientationMaskAll
,但是在一种极端情况下,它返回UIInterfaceOrientationMaskLandscape
。
如果用户旋转设备,则此方法有效。但是,如果将设备保持为纵向模式,则除非用户手动旋转设备,否则永远不会调用supportedInterfaceOrientations
方法。
如何以编程方式告诉系统此方法的返回值已更改?
根据文档,似乎我应该能够调用[UIViewController attemptRotationToDeviceOrientation]
,但是这没有任何效果(永远不会调用supportedInterfaceOrientations
,并且屏幕也不会旋转)。
我发现其他人发布了各种解决方法来尝试解决此问题,但是在我的测试中没有一个起作用。我怀疑他们可能在iOS 5.0中工作,但在iOS 6.0中却没有。
我在根 View Controller 的YES
方法中返回shouldAutorotate
。
最佳答案
首先,如果要在横向模式下显示UIViewController,使用它可能会很有用。
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}
另外,很大程度上取决于您的UIViewController嵌入在哪个 Controller 中。
例如,如果它在UINavigationController内部,则可能需要对该UINavigationController进行子类化,以覆盖此类定向方法。
子类UINavigationController(层次结构的顶部viewcontroller将控制方向。)需要将其设置为self.window.rootViewController。
- (BOOL)shouldAutorotate
{
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
从iOS 6开始,UINavigationController不会要求其UIVIewControllers提供方向支持。因此,我们将需要对其进行子类化。
注意:
每当完成Push操作时,UINavigationController始终会调用
shouldAutorotate
和supportedInterfaceOrientations
方法。关于ios - 当supportedInterfaceOrientations发生更改时,如何通知系统?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13150154/