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?
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
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)
}
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.
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?)