我有一个UIViewController
,代码如下:
- (BOOL) shouldAutorotate {
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationPortrait;
}
我没有使用UINavigationController
。显示此UIViewController
时,设备仍将旋转为横向。我的目标是iOS 9,这里有什么问题?
答案 0 :(得分:33)
所以问题是我在info.plist
中定义了允许的方向,这显然会覆盖整个项目中其他任何地方的任何方向。
要解决此问题,我从info.plist
中删除了条目,并在项目设置中对其进行了定义。现在一切都按预期工作了。
答案 1 :(得分:23)
我不认为Bryan的答案有效,因为在项目设置中更改方向也会将info.plist
更改为@mrhangz评论。
如果问题仅限iOS9,可能是因为iPad中的iOS9新功能称为Split view
。默认情况下iOS9启用Split view
,特别是iPad设备,请参阅Apple文档{{3 }}。
here
split view
强制您的应用在采用所有视图后支持所有方向。因此,如果您在info.plist
或目标常规设置中设置所有方向支持,则默认情况下支持split view
,这将忽略viewController中supportedInterfaceOrientations
的方向设置,并支持所有方向。
在撰写文档时,如果您在目标设置中选中Requires full screen
,那么您的应用将不支持split view
。现在您可以再次控制代码中的方向。
答案 2 :(得分:1)
我尝试了很多解决方案,但正确的解决方案是:
ios 8和9,无需编辑info.plist。
- (BOOL) shouldAutorotate {
return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return (UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown);
}
UIInterfaceOrientationUnknown
无法确定设备的方向。
UIInterfaceOrientationPortrait
设备处于纵向模式,设备直立,主页按钮位于底部。
UIInterfaceOrientationPortraitUpsideDown
设备处于纵向模式但是上下颠倒,设备竖直放置,主页按钮位于顶部。
UIInterfaceOrientationLandscapeLeft
设备处于横向模式,设备直立,主页按钮位于左侧。
UIInterfaceOrientationLandscapeRight
设备处于横向模式,设备直立,主页按钮位于右侧。
答案 3 :(得分:0)
快速5
以下代码将当前视图控制器锁定为纵向模式,但仍允许其他视图控制器转换为横向模式。我确实相信您必须在项目级别启用所有方向,然后使用此方法将其关闭然后再“关闭”,但是不确定是否有办法将它们重新打开。
private var _orientations = UIInterfaceOrientationMask.portrait
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get { return self._orientations }
set { self._orientations = .portrait }
}
可以在这里找到对这一切的更彻底的解释: The supportedInterfaceOrientations method doesn't override any method from its superclass
答案 4 :(得分:0)
为简单起见,对于iPad,如果info.plist中的支持的界面方向(iPad)属性包括所有四个方向,并且 UIRequiresFullScreen 属性值为 NO ,iOS会将您的应用视为支持拆分视图。如果某个应用程序支持拆分视图功能,则至少通过上述方式,您不能禁止其旋转。
我有一个详细的答案here。