强制视图控制器的方向

Forcing the orientation of a view controller

关于这个主题已经写了很多,我想知道为什么我只找到 "kind of hacks" 来实现它。

不要误会我的意思,我有解决 iOS 6 和 7 问题的方法,还有另一个解决 iOS 8 问题的方法。

这似乎是一个基本要求,在使用方向时,我简直不敢相信,没有 "recommended way"。

这是(常见的?)场景: 您的 iPhone 应用希望 运行 几乎始终处于纵向模式。只有少数 ViewController 想要支持横向,例如图像查看器或视频查看器。

因此您需要在项目设置中允许所有方向并决定视图控制器基础,每个视图控制器基础支持哪些方向。

有了 UINavigationController 和 UITabBarController 上的类别,您只需将所需的事件路由到您的视图控制器,以便让它们决定它们的方向 "prefer"。

除非您当前处于特定方向,否则所有这一切都很好,而您正在导航到的视图控制器不支持该方向,例如作为弹出或推送导航的结果。

这里我们现在需要"force"方向。不知何故,这总是需要某种破解。在我模态地放置一个空的视图控制器并立即将其关闭之前,这触发了方向变化。丑陋......现在在 iOS 8 中它不那么丑陋了,但仍然有些硬编码并且有点使用未记录方法的味道:UIDevice.currentDevice().setValue(NSNumber(integer: UIInterfaceOrientation.Portrait.rawValue), forKey: "orientation")

现在我想知道,这一定是很常见的事情。为什么没有解决方案,感觉像"Apple provided way"??

有某种 "viewer" 的图像和视频,支持纵向和横向,而其他任何东西只支持纵向,似乎是一个很常见的设置,包括 Apple 工程师在内的每个人都必须拥有同样的问题,当在横向模式下点击图像查看器中的 "back" 按钮然后返回到上一个视图时,必须在 viewDidAppear 上强制为 "Portrait",所以用户是 "forced" 将设备旋转回纵向。

我是不是忽略了一些明显的东西?? 如果没有这些 "hacks" 强制设备方向,我无法获得正确的解决方案。

iOS 7岁及以上

 NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];

只有当导航控制器堆栈中包含的视图控制器需要不同的行为时,这才会成为一个问题。 Apple 可能会问为什么要这样做 - 对于上面提到的 "viewer" 示例,总有其他选项,例如 presentViewController:animated: