Этот код должен работать:
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
}
}
}
Но помните, что вам нужно восстановить старый статус вращения после того, как контроллер будет выталкиваться навигации CON Троллингист. В этом примере я сохраняю статус вращения до его изменения и восстанавливаю его после исчезновения контроллера. Также вы можете использовать другой подход. Например, вы можете перегрузить 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
}
}
}
это не делает опять работа. Мой viewController находится в NavigationController, но у него (NavigationController) есть много других диспетчеров viewControllers, и мне это нужно только в одном контроллере. –
@OrkhanAlizade Подождите 10 минут. Я напишу новый код –
в порядке. Конечно. Я жду –