2016-11-04 3 views
11

Я пытаюсь предотвратить вращение на одном UIViewController, и я не могу этого добиться.overriding shouldAutorotate не работает в Swift 3

Я делаю что-то вроде этого:

open override var shouldAutorotate: Bool { 
    get { 
     return false 
    } 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    get { 
     return .portrait 
    } 
} 

И UIViewControler кадров вращения. UIViewController находится внутри открытого UINavigationController.

Я посмотрел много вопросов отсюда, и ни один ответ не работает для меня.

В Swift 2 я использовал для переопределения shouldAutorotate, но в Swift 3 эта функция больше не существует.

Как я могу это сделать в Swift 3, что я делал в Swift 2?

+1

Как выглядит ваш 'supportedInterfaceOrientations'? – matt

+0

@matt Я отредактировал вопрос, добавив, что – pableiros

+0

Спасибо. Хорошо, поэтому, если это представленный контроллер представления, он должен появляться только в портрете и оставаться там. Если этого не происходит, в истории должно быть больше. Можете ли вы описать _how_ этот контроллер представления? Докажите мне, что это полноэкранный представленный диспетчер представлений верхнего уровня. – matt

ответ

22

Я не знаю, почему голосование за закрытие вопроса, если я могу воспроизвести это поведение много раз. UIViewController находится внутри UINavigationController.

Это то, что я сделал для решения проблемы.

создать этот класс, и я настроен на UINavigationController что containt UIViewController, что я хочу, чтобы предотвратить, чтобы повернуть

class NavigationController: UINavigationController { 

    override var shouldAutorotate: Bool { 
     return false 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 

} 

И вот, он работает для меня

+0

, но что, если вы хотите только определенного UIViewController не вращаться, а не весь стек навигации? Этот ответ кажется лучшим: http://stackoverflow.com/a/39805665 –

+0

@RoyShilkrot Это нормально, цель вопроса состояла в том, как предотвратить вращение одного контроллера вида внутри контроллера навигации, а не как предотвратить определенный контроллер представления внутри всего навигационного стека – pableiros

3

Добавьте этот код в AppDelegate. скор

var orientationLock = UIInterfaceOrientationMask.all 
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    return self.orientationLock 
} 

struct AppUtility { 
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) { 
     if let delegate = UIApplication.shared.delegate as? AppDelegate { 
      delegate.orientationLock = orientation 
     } 
    } 

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) { 
     self.lockOrientation(orientation) 
     UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation") 
    } 
} 

Добавить в ViewController, что вы хотите, чтобы заставить ориентацию:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    //let value = UIInterfaceOrientation.landscapeLeft.rawValue 
    //UIDevice.current.setValue(value, forKey: "orientation") 


    AppDelegate.AppUtility.lockOrientation(.landscapeLeft) 

} 
+0

Это работает для меня, но принятый ответ намного чище и также работает.Существует ли конкретный сценарий, когда принятый ответ невозможен, и только это работает? – paul