Этот код должен работать:
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
}
}
}
person
Vasyl Khmil
schedule
29.04.2015