Forcer le mode paysage dans un ViewController à L'aide de Swift

j'essaie de forcer une seule vue dans mon application en mode paysage, Je vais appeler

override func shouldAutorotate() -> Bool {
    print("shouldAutorotate")
    return false
}

override func supportedInterfaceOrientations() -> Int {
    print("supportedInterfaceOrientations")
    return Int(UIInterfaceOrientationMask.LandscapeLeft.rawValue)
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
    return UIInterfaceOrientation.LandscapeLeft
}

la vue est lancée en mode portrait, et continue à tourner quand je change l'orientation de l'appareil.

Le shouldAutorotate n'est jamais appelé.

Toute aide serait appréciée.

40
demandé sur sazz 2014-11-20 13:55:50

11 réponses

Il peut être utile pour les autres, j'ai trouvé un moyen de forcer l'affichage de lancer en mode paysage:

Mettre cela dans le viewDidLoad():

let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")

et

override func shouldAutorotate() -> Bool {
    return true
}
51
répondu sazz 2014-11-21 10:01:32

Swift 4

override func viewDidLoad() {
    super.viewDidLoad()
    let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscapeLeft
}

override var shouldAutorotate: Bool {
    return true
}

Swift 3

override func viewDidLoad() {
    super.viewDidLoad()
    let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
}

private func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.landscapeLeft
}

private func shouldAutorotate() -> Bool {
    return true
}
29
répondu Manee ios 2018-05-29 04:59:31

Utiliser Swift 2.2

Essaie:

let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")

Suivi De:

UIViewController.attemptRotationToDeviceOrientation()

From Apple UIViewController Class Reference:

certains contrôleurs de vue peuvent vouloir utiliser des conditions spécifiques à l'application pour déterminer quelles orientations d'interface sont supportées. Si votre contrôleur de vue fait cela, lorsque ces conditions changent, votre application devrait appeler cette méthode de classe. Le système tente immédiatement de tourner dans la nouvelle orientation.

Puis, comme d'autres l'ont suggéré, remplacer les méthodes suivantes:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.LandscapeLeft
}

override func shouldAutorotate() -> Bool {
    return true
}

j'avais un problème similaire avec une vue de signature et cela l'a résolu pour moi.

16
répondu Aidan Malone 2016-06-06 14:42:58

Swift 4 Testé dans le iOS 11

Vous pouvez spécifier l'orientation dans objectifduprojet -> général -> Déploymentinfo (orientation de L'appareil) - > Portrait (Landscapeleft et Landscaperight en option)

AppDelegate

var orientationLock = UIInterfaceOrientationMask.portrait
    var myOrientation: UIInterfaceOrientationMask = .portrait
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return myOrientation
    }

LandScpaeViewController

override func viewDidLoad() {
        super.viewDidLoad()
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.myOrientation = .landscape
}

OnDismissButtonTap

let appDelegate = UIApplication.shared.delegate as! AppDelegate
 appDelegate.myOrientation = .portrait

c'est tout. :)

13
répondu Zeesha 2017-10-27 04:37:52

j'avais besoin de forcer un contrôleur à s'orienter vers le portrait. Ajouter cela a fonctionné pour moi.

swift 4 avec iOS 11

override var   supportedInterfaceOrientations : UIInterfaceOrientationMask{

    return  .portrait

}
5
répondu Rob Schlackman 2017-11-12 14:31:32

pour moi, les meilleurs résultats ont été obtenus en combinant la réponse de Zeesha et la réponse de sazz.

ajouter les lignes suivantes À AppDelegate.swift:

var orientationLock = UIInterfaceOrientationMask.portrait
var myOrientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return myOrientation
}  

ajouter la ligne suivante à votre classe de controller view:

let appDel = UIApplication.shared.delegate as! AppDelegate

ajouter les lignes suivantes à votre contrôleur de vue viewDidLoad():

appDel.myOrientation = .landscape
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")

(optionnel) Ajoutez cette ligne à votre fonction de rejet:

appDel.myOrientation = .portrait
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")

ce que font ces lignes de code est de définir l'orientation par défaut à portrait, tournez le paysage quand le contrôleur de vue se charge, puis réinitialisez-le enfin à portrait une fois que le contrôleur de vue se ferme.

4
répondu Microbob 2018-01-28 19:21:10

fonctionne avec Swift 2.2

 func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
    if self.window?.rootViewController?.presentedViewController is SignatureViewController {

        let secondController = self.window!.rootViewController!.presentedViewController as! SignatureViewController

        if secondController.isPresented {

            return UIInterfaceOrientationMask.LandscapeLeft;

        } else {

            return UIInterfaceOrientationMask.Portrait;
        }

    } else {

        return UIInterfaceOrientationMask.Portrait;
    }
}
2
répondu idris yıldız 2016-05-12 13:46:42

Swift 3. Cela verrouille l'orientation chaque fois que l'utilisateur ouvre de nouveau l'application.

class MyViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()

        // Receive notification when app is brought to foreground
        NotificationCenter.default.addObserver(self, selector: #selector(self.onDidBecomeActive), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
    }

    // Handle notification
    func onDidBecomeActive() {
        setOrientationLandscape()
    }

    // Change orientation to landscape
    private func setOrientationLandscape() {
        if !UIDevice.current.orientation.isLandscape {
            let value = UIInterfaceOrientation.landscapeLeft.rawValue
            UIDevice.current.setValue(value, forKey:"orientation")
            UIViewController.attemptRotationToDeviceOrientation()
        }
    }

    // Only allow landscape left
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.landscapeLeft
    }

    /*
    // Allow rotation - this seems unnecessary
    private func shouldAutoRotate() -> Bool {
        return true
    }
    */
    ...
}
1
répondu Greg T 2017-09-11 15:25:30

Swift 4

en Essayant de garder l'orientation, rien n'a fonctionné, mais c'est pour moi:

...        
override func viewDidLoad() {
       super.viewDidLoad()
       forcelandscapeRight()
       let notificationCenter = NotificationCenter.default
       notificationCenter.addObserver(self, selector: #selector(forcelandscapeRight), name: Notification.Name.UIDeviceOrientationDidChange, object: nil)
    }

    @objc func forcelandscapeRight() {
        let value = UIInterfaceOrientation.landscapeRight.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")
    }
....
1
répondu Daxito 2017-09-29 21:15:15

Selon documentation des interfacesorientations supportéesshouldAutorotate la méthode doit retourner true ou YES dans L'Objectif-C pour que le supportedInterfaceOrientations sont pris en compte.

0
répondu Sebastian Wramba 2014-11-20 11:58:45
class CustomUIViewController : UIViewController{

    override var   supportedInterfaceOrientations : UIInterfaceOrientationMask{

        return  .landscapeLeft

    }

}


class ViewController: CustomUIViewController {
.
.
.
}
-3
répondu Tal 2017-05-20 10:45:40