锁定方向在iPad iOS 8中无效,使用Swift和Xcode 6.2。

30

我从应用程序的一般设置中将应用程序方向锁定为纵向,就像这样:

portrait

但当我在iPad上运行我的应用程序时,它仍然会旋转!?

那我应该在哪里锁定方向呢?

为什么苹果会在设置中添加此功能,而它却不起作用!?

更新:

我尝试将此viewController实现为所有viewController的常规设置。

import Foundation
import UIKit

class GeneralViewController: UIViewController {

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        let value = UIInterfaceOrientation.Portrait.rawValue
        UIDevice.currentDevice().setValue(value, forKey: "orientation")
    }

    override func supportedInterfaceOrientations() -> Int {
        return Int(UIInterfaceOrientationMask.Portrait.rawValue)
    }


    override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
        return UIInterfaceOrientation.Portrait
    }

    override func shouldAutorotate() -> Bool {
        return false
    }
}

这张图片是我应用程序的主要navigationController中的截图。

答案1的图片

还是不起作用!

这个东西到底怎么工作?

7个回答

115

您不需要额外的代码,我正在使用Xcode 7.0.1进行工作,我注意到当我将屏幕方向锁定为竖屏时,它只在iPhone上锁定,在iPad上也要锁定它,您需要从设备中选择iPad(而不是通用)并勾选竖屏,取消其他选项,然后再将设备改回通用,因为我发现通用只反映在iPhone上,这可能是Xcode中的某种错误。


2
绝对是个好答案。我们怎么会知道呢? :D。这是一个很好的发现。 - Tarvo Mäesepp
2
我无法强调这个赞同的重要性。我快被这个问题逼疯了。 - Buyin Brian
1
即使在Xcode 9中仍然存在相同的混淆!在进行通用化之前检查每个设备的方向是有效的 :) 谢谢 - Maziyar
1
我在iOS 11中尝试了所有可能的方法,但这个方法真的帮了我大忙。这并不是一种显而易见的解决方案,感谢您的分享! - Alessign
2
到现在还有这个bug,真不敢相信(在Xcode 10.1上测试过)。 - Duan Nguyen
显示剩余9条评论

8

我也遇到了同样的问题,解决方法如下:-> 在设备类型中选择iPad而不是通用 -> 取消勾选除Portrait之外的其他三个选项 -> 再次选择通用。 完成。


8

您可以覆盖视图控制器属性 shouldAutorotate

override var shouldAutorotate: Bool {
    return false 
}

如果您的视图控制器嵌入在导航控制器中,您可以创建一个自定义导航控制器:
class PortraitNavigationController: UINavigationController {

    override var shouldAutorotate: Bool {
        return false 
    }
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */
}

你可以创建一个自定义的视图控制器并将其添加到那里。 - Leo Dabus
啊,这听起来更好。我正在寻找像代理外观这样的解决方案,一次更改它就可以在整个项目中生效。 - MBH
它是嵌入在导航控制器还是标签栏控制器中? - Leo Dabus
是的,我在一些控制器中使用了导航控制器和选项卡。 - MBH
尝试将支持的界面方向添加到您的导航控制器中。 - Leo Dabus
注意:您屏幕截图上显示的布局与此无关。 - Leo Dabus

5
这是对Mohammed Elrashidy方案的评论,但我没有足够的声望来发表评论。我正在使用XCode 9.1和Swift 3。
我的应用需要一些图形屏幕进行自动旋转,但所有其他屏幕都要保持固定。我的问题是“通用》部署信息”中的“iPad”设备配置与iPhone和通用设备配置不一致。我在iPhone和通用设备上勾选了“纵向”,“左横向”和“右横向”,但在iPad上勾选了所有方向(包括“倒置”)。简单地取消“倒置”选项使iPad设备执行我的Swift逻辑中的shouldAutorotate和supportedInterfaceOrientations调用。
我的Info.plist现在看起来像下面这样,我可以通过编程的方式打开或关闭iPad的自动旋转。
<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

完美的解决方案,谢谢!将其设置在plist中很可能是更好的选择。 - JohnV

3

我只想补充一下,在按照上述解决方案修复问题之后,您还需要执行以下操作:

在 XCode 中,确保您还检查了“General > Targets”下的“Requires Full Screen”复选框。

参考链接: iPad多任务支持需要这些方向


低估的评论,在尝试了10多个答案后,这是最终有效的答案。还需要将代码添加到ViewController中。XCode 12。 - GregT

1

由于XCode在过去的五年中发生了很多变化,当我遇到同样的问题时,我找到了一种简单的处理方法,即使我将设备方向配置为仅允许“纵向”,在iPad设备上这个限制也不起作用。

因此,在新创建的项目中,需要进入Targets->Info->Custom iOS Target Properties-> Supported interface orientations(iPad)。然后删除您不需要的布局,这个技巧就会起作用。


1
打开 Info.plist,在“支持的界面方向(iPad)”下删除您不需要的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接