web-dev-qa-db-fra.com

Obtenir l'orientation du périphérique dans Swift

Je me demandais comment je pouvais obtenir l'orientation actuelle du périphérique dans Swift? Je sais qu'il existe des exemples pour Objective-C, mais je n'ai pas réussi à le faire fonctionner à Swift.

J'essaie d'obtenir l'orientation du périphérique et de le mettre dans une déclaration if.

C'est la ligne avec laquelle j'ai le plus de problèmes:

[[UIApplication sharedApplication] statusBarOrientation]
57
user3746428

vous pouvez utiliser:

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
    var text=""
    switch UIDevice.currentDevice().orientation{
    case .Portrait:
        text="Portrait"
    case .PortraitUpsideDown:
        text="PortraitUpsideDown"
    case .LandscapeLeft:
        text="LandscapeLeft"
    case .LandscapeRight:
        text="LandscapeRight"
    default:
        text="Another"
    }
    NSLog("You have moved: \(text)")        
}

Swift 3 UPDATE

override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
    var text=""
    switch UIDevice.current.orientation{
    case .portrait:
        text="Portrait"
    case .portraitUpsideDown:
        text="PortraitUpsideDown"
    case .landscapeLeft:
        text="LandscapeLeft"
    case .landscapeRight:
        text="LandscapeRight"
    default:
        text="Another"
    }
    NSLog("You have moved: \(text)")        
}

ou

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
}

avec Notification, vous pouvez vérifier: IOS8 Swift: Comment détecter un changement d’orientation?

(NOTE:} _ didRotateFromInterfaceOrientation est obsolète. Utilisez viewWillTransitionToSize pour iOS 2.0 et versions ultérieures

55
Miguel

Pour obtenir l'orientation de la barre d'état (et donc de l'interface utilisateur) telle que le code Objective-C que vous avez, il suffit simplement de:

UIApplication.sharedApplication().statusBarOrientation

Vous pouvez également utiliser la propriété orientation de UIDevice:

UIDevice.currentDevice().orientation

Cependant, cela peut ne pas correspondre à l'orientation de votre interface utilisateur. Dans la documentation:

La valeur de la propriété est une constante qui indique le courant orientation de l'appareil. Cette valeur représente le physique l'orientation de l'appareil et peut être différent de l'actuel l'orientation de l'interface utilisateur de votre application. Voir «UIDeviceOrientation» pour la description des valeurs possibles.

45
Mike S

Apple s'est récemment débarrassé de l'idée Paysage contre Portrait et préfère utiliser la taille d'écran. Cependant, cela fonctionne:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("landscape")
    } else {
        print("portrait")
    }
}
22
zSprawl
struct DeviceInfo {
struct Orientation {
    // indicate current device is in the LandScape orientation
    static var isLandscape: Bool {
        get {
            return UIDevice.current.orientation.isValidInterfaceOrientation
                ? UIDevice.current.orientation.isLandscape
                : UIApplication.shared.statusBarOrientation.isLandscape
        }
    }
    // indicate current device is in the Portrait orientation
    static var isPortrait: Bool {
        get {
            return UIDevice.current.orientation.isValidInterfaceOrientation
                ? UIDevice.current.orientation.isPortrait
                : UIApplication.shared.statusBarOrientation.isPortrait
        }
    }
}}

Swift4 répond: Voici comment je le fais, 

1. fonctionne pour tous les types de contrôleur de vue

2. fonctionne également lorsque l'utilisateur fait pivoter l'application 

3.à installer pour la première fois l'application

14
Ernie Cheng

Pour trouver l'orientation actuelle du périphérique, utilisez simplement ce code:

UIApplication.sharedApplication (). StatusBarOrientation

pour Swift 3.0 

UIApplication.shared.statusBarOrientation

12
Usman Nisar

Swift 4:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            print("landscape")
        } else {
            print("portrait")
        }
    }
10
FBC

J'ai eu des problèmes avec l'utilisation de InterfaceOrientation, cela a fonctionné correctement, sauf qu'il ne permettait pas d'accéder à l'orientation au chargement. Alors j'ai essayé ça et c'est un gardien. Cela fonctionne car le bounds.width fait toujours référence à l'orientation actuelle, contrairement à nativeBounds.width qui est absolu.

    if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
        // do your portrait stuff
    } else {    // in landscape
        // do your landscape stuff
    }

J'appelle cela de willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) et de viewDidLoad mais c'est flexible.

Merci à zSprawl pour le pointeur dans cette direction. Je dois souligner que cela n’est valable que pour iOS 8 et les versions ultérieures.

8
bpedit

Donc, si Apple déconseille la totalité de la chaîne d’orientation ("portrait", "paysage"), alors tout ce qui vous importe est le rapport largeur/hauteur. (un peu comme la réponse de @ bpedit)

Lorsque vous divisez la largeur par la hauteur, si le résultat est inférieur à 1, l'écran principal ou le conteneur ou tout ce qui est en "portrait" "en mode". Si le résultat est supérieur à 1, il s'agit d'une peinture "paysage". ;)

override func viewWillAppear(animated: Bool) {
    let size: CGSize = UIScreen.mainScreen().bounds.size
    if size.width / size.height > 1 {
        print("landscape")
    } else {
        print("portrait")
    }
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if size.width / size.height > 1 {
        print("landscape")
    } else {
        print("portrait")
    }
}

(J'imagine que si vous utilisez cette approche, alors vous ne vous souciez probablement pas de traiter spécifiquement la condition lorsque le rapport est exactement égal à 1, largeur égale et hauteur.)

7
Rob

Swift 3+

Fondamentalement:

NotificationCenter.default.addObserver(self, selector: #selector(self.didOrientationChange(_:)), name: .UIDeviceOrientationDidChange, object: nil)

@objc func didOrientationChange(_ notification: Notification) {
    //const_pickerBottom.constant = 394
    print("other")
    switch UIDevice.current.orientation {
        case .landscapeLeft, .landscapeRight:
            print("landscape")
        case .portrait, .portraitUpsideDown:
            print("portrait")
        default:
            print("other")
    }
}

:)

2
stakovereser

Swift 3 , basé sur la réponse de Rob 

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if (size.width / size.height > 1) {
        print("landscape")
    } else {
        print("portrait")
    }
}
2
Johan Tingbacke
   override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        NSLog("Landscape");
    }
    else {
        NSLog("Portrait");
    }
}
2
Sanju

J'ai trouvé que le code alternatif dans Swift pour le code Obj-C

if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 

est

if UIApplication.shared.statusBarOrientation.isLandscape

Remarque: nous essayons de trouver l'orientation de la barre d'état est paysage ou non. Si c'est paysage alors l'énoncé if est vrai.

0
Akarsh SEGGEMU