我的根视图控制器的
supportedInterfaceOrientations
实现几乎总是返回 UIInterfaceOrientationMaskAll
,但是有一种边缘情况会返回 UIInterfaceOrientationMaskLandscape
。
如果用户旋转设备,则此功能有效。但是,如果设备处于纵向模式,则永远不会调用
supportedInterfaceOrientations
方法,除非用户手动旋转设备。
如何以编程方式告诉系统该方法的返回值已更改?
根据文档,似乎我应该能够调用
[UIViewController attemptRotationToDeviceOrientation]
但这没有任何效果(supportedInterfaceOrientations
永远不会被调用并且屏幕不会旋转)。
我发现其他人发布了各种解决方法来尝试解决这个问题,但它们在我的测试中都不起作用。我怀疑它们可能在 iOS 5.0 中工作,但在 iOS 6.0 中不行。
我正在根视图控制器的
YES
方法中返回 shouldAutorotate
。
首先,如果你想以横向模式显示 UIViewController,那么使用它可能会很有用。
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}
此外,很大程度上取决于您的 UIViewController 嵌入哪个控制器。
例如,如果它位于 UINavigationController 内部,那么您可能需要对该 UINavigationController 进行子类化以覆盖这样的方向方法。
子类 UINavigationController (层次结构的顶层视图控制器将控制方向。)需要将其设置为 self.window.rootViewController。
- (BOOL)shouldAutorotate
{
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
从 iOS 6 开始,UINavigationController 不会向其 UIVIewControllers 请求方向支持。因此我们需要对其进行子类化。
注:
每当 Push 操作完成时,UINavigationController 总会调用shouldAutorotate
和
supportedInterfaceOrientations
方法。
注意:在启动时,应用程序应始终将其界面设置为纵向。在 application:didFinishLaunchingWithOptions: 方法返回后,应用程序使用上述视图控制器旋转机制在显示窗口之前将视图旋转到适当的方向。
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html
如果界面以纵向启动,即使用户在设备侧面打开应用程序,自动旋转也应该能够处理调整。
更新:我发现这篇文章应该有助于启动后的轮换。显然,iOS 6 通过查看导航控制器来确定支持的设备方向。
viewWillAppear:
方法中调用以下逻辑:
UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation];
if (![self supportsOrientation:curDevOrientation]) {
// We're going to rotate 90 degrees clockwise. First figure out what that
// means to the status bar.
UIInterfaceOrientation newStatusBarOrientation;
switch (curDevOrientation) {
case UIDeviceOrientationPortrait:
newStatusBarOrientation = UIInterfaceOrientationLandscapeRight;
break;
case UIDeviceOrientationPortraitUpsideDown:
newStatusBarOrientation = UIInterfaceOrientationLandscapeLeft;
break;
}
[[UIApplication sharedApplication] setStatusBarOrientation:newStatusBarOrientation animated:NO];
// Now rotate the view 90 degrees clockwise.
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * 90.0 / 180.0);
self.view.transform = transform;
}
无论何时出现,都应该旋转特定视图控制器的视图。