这段代码应该可以工作:
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
override func shouldAutorotate() -> Bool{
return false
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return UIInterfaceOrientation.Portrait
}
如果它现在对你有用,那么我想你的控制器在另一个控制器中(UINavigationController,UITabBarController,UISplitViewController)。在这种情况下,您需要在该父控制器中使用此代码。
如果您的导航控制器包含多个视图控制器,并且您只需要为其中一些禁用方向,那么您需要继承 UINavigationController 类并在其中编写如下内容:
class NavigationController: UINavigationController {
var shouldRotate: Bool = true
override func supportedInterfaceOrientations() -> Int {
return shouldRotate ? Int(UIInterfaceOrientationMask.Portrait.rawValue) : Int(UIInterfaceOrientationMask.All.rawValue)
}
override func shouldAutorotate() -> Bool{
return shouldRotate
}
}
然后在需要禁用方向的控制器中,您可以为导航控制器禁用它:
class ViewController: UIViewController {
var lastControllerRotationStatus: Bool?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let navigationController = self.navigationController as? NavigationController {
lastControllerRotationStatus = navigationController.shouldRotate
navigationController.shouldRotate = false
}
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
if let navigationController = self.navigationController as? NavigationController {
navigationController.shouldRotate = lastControllerRotationStatus ?? true
}
}
}
但请记住,在您的控制器被推出导航控制器后,您需要恢复旧的旋转状态。在此示例中,我在更改旋转状态之前保存它,并在控制器消失后恢复它。您也可以使用其他一些方法。例如,您可以重载UINavigationController 方法popViewController,并将shouldRotate 设置为false。
与控制器变量设置相同的方法,您可以使用AppDelegate方法application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int控制旋转
那么你就不需要从导航控制器继承了。
您的 AppDelegate 类代码如下所示:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var shouldRotate = true
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
return shouldRotate ? Int(UIInterfaceOrientationMask.All.rawValue) : Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
}
您的控制器代码将如下所示:
class ViewController: UIViewController {
var lastControllerRotationStatus: Bool?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
lastControllerRotationStatus = appDelegate.shouldRotate
appDelegate.shouldRotate = false
}
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
appDelegate.shouldRotate = lastControllerRotationStatus ?? true
}
}
}