添加: 你可以在 github 上访问这个项目 ios6rotations
很抱歉询问有关 iOS 6 中屏幕旋转的问题,但这真的很让人头疼……而且我仍然不能完全理解它——出于某种原因,它在某些情况下表现不同。
我的测试应用程序中有以下简单的 View 层次结构:
我想要实现的是 - 让蓝色 Controller 只在横向上,红色 Controller 只在纵向上。
我有一个 UINavigationController 的子类,里面有这样的代码:
@implementation CustomNavController
- (BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
在我的蓝色 Controller 中我实现了这个:
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
在红色 Controller 中:
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
现在我有以下行为:
- 应用横向启动(OK)
- 当我按下按钮时,我的红色 Controller 也被插入横向(这不行,因为它必须以纵向显示)
- 它成功旋转到纵向但没有返回到横向
- 如果我让红色 Controller 保持纵向模式,我的蓝色 Controller (仅限横向)显示为纵向模式。
附言 我所有的旋转方法(上面发布的)都被正常调用。(顺便说一句,为什么这些方法在每次屏幕转换时被调用这么多次 - 5-6 次)
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
不会通过推送调用
所有(除了 portraitUpsideDown)方向都包含在 plist 中。
问题是 - 如何在每个 Controller 中强制旋转到支持的方向?
我建议您在这里发布(作为答案)任何 100% 有效的代码来处理 ios6 中的旋转(例如,如果您有一些用于 iPad 和 SplitController 的代码)- 我会把这个问题保存在收藏夹中,以便将所有内容放在一个地方当我需要处理一些特定情况时。干杯!
添加: 请不要将此作为答案发布 from landscape to portrait我希望有' 这是更优雅的方式。
最佳答案
使用 -[UIDevice setOrientation:]
是私有(private) API,会导致您的申请被拒绝。参见 this question .
您所要求的使用公共(public) API 是不可能的,从 HIG 的角度来看也不推荐。 受支持并且您应该实现的是具有不同受支持界面方向的不同 View Controller 的模式呈现。这就是为什么 UINavigationController
的默认实现总是旋转;它假定所有 View Controller 都具有相同的受支持界面方向。
以 iPhone 上的视频播放为例。打开视频应用程序(iOS 附带)。 Root View Controller 仅支持纵向。但是,启动视频,弹出一个仅支持横向界面方向的模态视图 Controller 。这似乎正是您希望实现的行为。
这就是为什么 preferredInterfaceOrientationForPresentation
没有被调用的原因。 preferredInterfaceOrientationForPresentation
仅在使用 presentViewController:animated:
时被调用。
一个小陷阱,如果您需要在场景的每个阶段都有一个导航栏,您需要将每个模态视图 Controller 包含在一个导航 Controller 中。然后,您可以通过访问 segue 中导航 Controller 对象的 topViewController
,在 prepareForSegue:
中传递所需的数据。
这是一个根据您的要求正确运行的示例项目(或者至少会给您一些实现的想法):
关于ios - 如何处理 iOS 中的不同方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947349/