ios - Obtener orientación del dispositivo en Swift
orientation (12)
Apple recientemente se deshizo de la idea de Paisaje vs. Retrato y prefiere que usemos el tamaño de la pantalla. Sin embargo, esto funciona:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
Me preguntaba cómo puedo obtener la orientación actual del dispositivo en Swift. Sé que hay ejemplos para Objective-C, sin embargo, no he podido hacerlo funcionar en Swift.
Estoy tratando de obtener la orientación del dispositivo y ponerlo en una declaración if.
Esta es la línea con la que tengo más problemas:
[[UIApplication sharedApplication] statusBarOrientation]
Encontré que el código alternativo en Swift para el código Obj-C
if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))
es
if UIApplication.shared.statusBarOrientation.isLandscape
Nota: estamos tratando de encontrar que la orientación de la barra de estado sea horizontal o no. Si es horizontal, entonces la declaración if es verdadera.
Entonces, si Apple está desaprobando toda la cadena de orientación ("retrato", "paisaje"), entonces lo único que le importa es la relación de ancho a alto. (como la respuesta de @ bpedit)
Cuando divide el ancho por la altura, si el resultado es menor que 1, entonces la pantalla principal o el contenedor o lo que sea que esté en modo "vertical". Si el resultado es mayor que 1, es una pintura de "paisaje". ;)
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")
}
}
(Supongo que si usa este enfoque, entonces probablemente no le importe manejar específicamente la condición cuando la relación es exactamente 1, igual ancho y alto).
Para encontrar la orientación actual del dispositivo, simplemente use este código:
UIApplication.sharedApplication (). StatusBarOrientation
para swift 3.0
UIApplication.shared.statusBarOrientation
Para obtener la orientación de la barra de estado (y para ello la IU) como el código Objective-C que tiene, es simplemente:
UIApplication.sharedApplication().statusBarOrientation
También puede usar la
propiedad
de
orientation
de UIDevice:
UIDevice.currentDevice().orientation
Sin embargo, eso puede no coincidir con la orientación de su IU. De los documentos:
El valor de la propiedad es una constante que indica la orientación actual del dispositivo. Este valor representa la orientación física del dispositivo y puede ser diferente de la orientación actual de la interfaz de usuario de su aplicación. Consulte "UIDeviceOrientation" para obtener descripciones de los posibles valores.
Swift 3+
Básicamente:
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")
}
}
:)
Tuve problemas con el uso de
InterfaceOrientation
, funcionó bien, excepto que no estaba accediendo a la orientación al cargar.
Así que probé esto y es un portero.
Esto funciona porque los
bounds.width
siempre hace referencia a la orientación actual en lugar de
nativeBounds.width
que es absoluto.
if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
// do your portrait stuff
} else { // in landscape
// do your landscape stuff
}
Llamo a esto desde
willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval)
y desde
viewDidLoad
pero es flexible.
Gracias a zSprawl por el puntero en esa dirección. Debo señalar que esto solo es bueno para iOS 8 y versiones posteriores.
puedes usar:
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)")
}
ACTUALIZACIÓN DE SWIFT 3
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)")
}
o
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
}
con Notificación puede verificar: IOS8 Swift: ¿Cómo detectar el cambio de orientación?
NOTA: didRotateFromInterfaceOrientation está en desuso Use viewWillTransitionToSize para iOS 2.0 y versiones posteriores
Swift 3 , basado en la respuesta de Rob
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if (size.width / size.height > 1) {
print("landscape")
} else {
print("portrait")
}
}
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
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
}
}
}}
respuesta swift4: así es como lo hago,
1. funciona para todo tipo de controlador de vista
2.también funciona cuando el usuario gira la aplicación
3.también instala por primera vez la aplicación
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
if (toInterfaceOrientation.isLandscape) {
NSLog("Landscape");
}
else {
NSLog("Portrait");
}
}