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]
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
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.
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")
}
}
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
Pour trouver l'orientation actuelle du périphérique, utilisez simplement ce code:
UIApplication.sharedApplication (). StatusBarOrientation
pour Swift 3.0
UIApplication.shared.statusBarOrientation
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
print("landscape")
} else {
print("portrait")
}
}
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.
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.)
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")
}
}
:)
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")
}
}
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
if (toInterfaceOrientation.isLandscape) {
NSLog("Landscape");
}
else {
NSLog("Portrait");
}
}
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.