J'ai un UIViewController, je veux désactiver ou activer la rotation de l'écran dans différents scénarios
Exemple:
if flag {
rotateDevice = false
}
else {
rotateDevice = true
}
Comment puis je faire ça?
J'ai la réponse. Sur AppDelegate
, si vous faites pivoter un périphérique, un contrôleur de vue Push, etc. Cette fonction appelle toujours
Mise à jour pour Swift 3/4
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
{
return self.restrictRotation
}
self.restrictRotation
est un paramètre personnalisé.
Comment utiliser:
Dans Appdelegate:
var restrictRotation:UIInterfaceOrientationMask = .portrait
Dans ViewController:
Lorsque la méthode ViewDidLoad ou viewWillAppear est appelée. Nous allons changer comme ceci:
(UIApplication.shared.delegate as! AppDelegate).restrictRotation = .all
et ensuite cette méthode sur AppDelegate sera appelée.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
Vous devez simplement implémenter shouldAutorotate
et supportedInterfaceOrientations
dans votre UIViewController
. Regardez cette documentation . Par exemple:
override func shouldAutorotate() -> Bool {
return true
}
Vous pouvez également spécifier les orientations disponibles. Voici un exemple avec uniquement les orientations de portraits:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Landscape
}
Edit: Si vous voulez supporter une orientation différente en ce qui concerne un drapeau, il vous suffit de faire quelque chose comme ceci:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if myFlag {
return .Landscape
} else {
return .All
}
}
(Si myFlag
est vrai, il autorisera l'orientation Landscape
. Sinon, il autorisera toutes les orientations).
Swift 4
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get {
return .portrait
}
}
Dans Swift 5, à partir de la version précédente, si vous souhaitez autoriser (éviter les autres) un UIViewController particulier à pivoter dans une certaine orientation, vous devez outrepasser "supportedInterfaceOrientations" dans votre classe UIViewController:
class MyViewController:UIViewController{
override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get{
return .portrait
}
}
}
Ici, il y a les options possibles:
public struct UIInterfaceOrientationMask : OptionSet {
public init(rawValue: UInt)
public static var portrait: UIInterfaceOrientationMask { get }
public static var landscapeLeft: UIInterfaceOrientationMask { get }
public static var landscapeRight: UIInterfaceOrientationMask { get }
public static var portraitUpsideDown: UIInterfaceOrientationMask { get }
public static var landscape: UIInterfaceOrientationMask { get }
public static var all: UIInterfaceOrientationMask { get }
public static var allButUpsideDown: UIInterfaceOrientationMask { get }
}
étend
Si vous voulez pouvoir distinguer entre iPad et iPhone, vous pouvez utiliser UIUserInterfaceIdiom:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get{
return UIDevice.current.userInterfaceIdiom == .phone ? [.portrait, . portraitUpsideDown]:.all //OBS -> You can also return an array
}
}
où:
public enum UIUserInterfaceIdiom : Int {
case unspecified
@available(iOS 3.2, *)
case phone // iPhone and iPod touch style UI
@available(iOS 3.2, *)
case pad // iPad style UI
@available(iOS 9.0, *)
case tv // Apple TV style UI
@available(iOS 9.0, *)
case carPlay // CarPlay style UI
}