Отключить ориентацию экрана в swift 4 для UINavigationController и UIViewController

Привет, я пытаюсь остановить авторотацию в одном из контроллеров представления в моем проекте. На снимке ниже,

У меня есть старт UINavigationController а затем UIViewController, Я реализовал следующий код для остановки авторотации:

extension UINavigationController {

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

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
        get {
            return UIInterfaceOrientationMask.landscape
        }
    }}

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
       // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override open var shouldAutorotate: Bool {
        return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask
    {
        return .landscape
    }
  }

Но приведенный выше код, похоже, не вызывает и не дает никакого эффекта. я использую Xcode 9 а также swift 4.0, Любое предложение будет оценено.

С уважением, Нина

2 ответа

Создайте класс и установите его UINavigationController, затем используйте этот новый класс в вашей раскадровке /XIB

В вашем расширении:

class NavigationController: UINavigationController {     
    override var shouldAutorotate: Bool {
        return topViewController?.shouldAutorotate ?? super.shouldAutorotate
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return topViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
    }
}

В вашем контроллере:

override var shouldAutorotate: Bool {
    return false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

У меня была такая же проблема. Я просмотрел переполнение стека и перепробовал многие решения, но ни одно из них не сработало. Я нашел это решение на форумах разработчиков Apple, и оно сработало как шарм.

Я добавляю их решение здесь в надежде, что другим будет легче найти его в будущем, отдавая должное автору и ссылаясь на его пост.

Добавьте в свой файл AppDelegate:

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")

    }

}

Добавьте к контроллеру представления, для которого вы хотите задать ориентацию:

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)

    AppDelegate.AppUtility.lockOrientation(.portrait)

}

override func viewWillDisappear(_ animated: Bool) {

    super.viewWillDisappear(animated)

    AppDelegate.AppUtility.lockOrientation(.all)

}

Это просто пояснение к ответу TagTaco выше.

создать собственный класс

class CustomUINavigationController: UINavigationController {
    override var shouldAutorotate: Bool {
        return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
}

Теперь вы можете создать такой контроллер навигации:

let navController = CustomUINavigationController(rootViewController: YourController())

Надеюсь, это кому-то поможет. Ура.