web-dev-qa-db-fra.com

le remplacement de shouldAutorotate ne fonctionne pas dans Swift 3

J'essaie d'empêcher la rotation sur un UIViewController et je ne peux pas y arriver.

Je fais quelque chose comme ça:

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

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

Et le UIViewControler continue de tourner. UIViewController se trouve dans un UINavigationController ouvert de façon modale.

J'ai regardé beaucoup de questions d'ici et aucune réponse ne fonctionne pour moi.

Dans Swift 2, j'avais l'habitude de remplacer shouldAutorotate mais dans Swift 3 cette fonction n'existe plus).

Comment puis-je faire cela en Swift 3 ce que je faisais en Swift 2?

28
pableiros

Je ne sais pas pourquoi il y a un vote pour clore la question si je peux reproduire ce comportement plusieurs fois. Le UIViewController est à l'intérieur d'un UINavigationController ouvert de façon modale.

C'est ce que j'ai fait pour résoudre le problème.

Je crée cette classe et je mets le UINavigationController qui contient le UIViewController que je veux empêcher de faire pivoter

class NavigationController: UINavigationController { 

    override var shouldAutorotate: Bool {
        return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }

}

Et c'est tout, ça marche pour moi

42
pableiros

Ajoutez ce code à AppDelegate.Swift

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

Ajoutez au viewcontroller que vous souhaitez forcer une orientation:

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


    AppDelegate.AppUtility.lockOrientation(.landscapeLeft)

}
9

Pour moi, la réponse votée n'a pas fonctionné. Au lieu,

override open var shouldAutorotate: Bool {
    return false
}

override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return UIApplication.shared.statusBarOrientation
}

Ces codes fonctionnent. Confirmé en Swift 4.

4
14c

J'ai constaté qu'iOS 11 n'appelait pas du tout ces méthodes, sauf si j'avais implémenté la méthode UIApplicationDelegate suivante dans ma classe AppDelegate:

application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)
3
Thuggish Nuggets