web-dev-qa-db-fra.com

iOS. Comment activer et désactiver la rotation sur chaque UIViewController?

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?

22
Bao Tuan Diep

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
40
Bao Tuan Diep

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

22
Julien Quere

Swift 4

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get {
        return .portrait

    }
}
13
Baryon Lee

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
}
4
Reimond Hill