强制视图控制器的方向

时间:2015-05-26 10:52:10

标签: ios objective-c iphone swift uiinterfaceorientation

关于这个话题已经写了很多,我很想知道,为什么我只能找到“有点黑客”来实现它。

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

这似乎是一个基本要求,在使用方向时,我无法相信,没有“推荐方式”。

这是(常见的)场景: 您的iPhone应用程序几乎总是在纵向模式下运行。只有少数ViewControllers需要支持横向,例如图像查看器或视频查看器。

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

使用UINavigationController和UITabBarController上的类别,您只需简单地将所需的事件路由到视图控制器,以便让他们决定“他们喜欢”哪个方向。

所有这一切都很有效,除非您当前处于某个方向,这在您导航到的视图控制器中不受支持,例如弹出或推送导航的结果。

现在我们需要“强制”定位。不知何故,这总是需要一种黑客攻击。在我以模态方式放置一个空视图控制器并立即将其解除之前,这触发了方向改变。丑陋......现在在iOS 8中它不那么难看,但仍然有点硬编码,并且喜欢使用未记录的方法:UIDevice.currentDevice().setValue(NSNumber(integer: UIInterfaceOrientation.Portrait.rawValue), forKey: "orientation")

现在我想知道,这一定是个常见的事情。为什么没有解决方案,感觉就像“Apple提供的方式”?

拥有支持肖像和风景的图像和视频的某种“观看者”,其他任何东西只支持肖像,似乎是一种常见的设置,包括Apple工程师在内的每个人都必须遇到同样的问题,当在横向模式下点击图像查看器中的“后退”按钮然后返回到前一个视图时,必须在viewDidAppear上将其强制为“纵向”,以便用户“强制”将设备旋转回纵向。 / p>

我忽略了一些明显的东西吗? 没有这些“黑客”强迫设备上的方向,我无法实现正确的解决方案。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

iOS 7及以上版本

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