Obter a orientação do dispositivo no Swift
esta é a linha com a qual tenho mais problemas:
[[UIApplication sharedApplication] statusBarOrientation]
10 answers
Pode 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)")
}
ACTUALIZAÇÃO 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)")
}
Ou
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
}
Com a notificação pode verificar: iOS8 Swift: como detectar a mudança de orientação?
Nota : didrotatefromterfaceoriation está desactualizado verwilltransitiontosize para iOS 2. 0 e mais tarde
Para obter a orientação da barra de estado (e por isso UI) como o código Objectivo-C que você tem, é simplesmente:
UIApplication.sharedApplication().statusBarOrientation
Também pode utilizar o orientation
Propriedade {[8] } de UID Vice:
UIDevice.currentDevice().orientation
No entanto, isso pode não corresponder à orientação da sua IU. Dos documentos:
O valor da propriedade é uma constante que indica a corrente orientação do dispositivo. Este valor representa o orientação do dispositivo e pode ser diferente do corrente orientação da interface de usuário da sua aplicação. Ver "Uideviceorientação" para descrições dos valores possíveis.
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
Para encontrar a orientação actual do dispositivo, basta usar este código:
Uiaplicação.pedido de participação().statusBarOrientation
Para swift 3.0
Uiaplicação.compartilhado.statusBarOrientation
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 resposta: é assim que eu faço.
1.funciona para todos os tipos de controlador de vista
2.também funciona quando o utilizador roda a aplicação
3.também pela primeira vez instale o app
bounds.width
está sempre em referência à orientação atual em oposição a nativeBounds.width
que é absoluta.
if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
// do your portrait stuff
} else { // in landscape
// do your landscape stuff
}
Chamo a isto de willRotateToInterfaceOrientation(toInterfaceOrientation:
UIInterfaceOrientation, duration: NSTimeInterval)
e de viewDidLoad
mas é flexível.
Graças à zSprawl pelo ponteiro naquela direcção. Devo salientar que isto só é bom para o iOS 8 e mais tarde.
Então, se a Apple está a depreciar toda a linha de orientação ("retrato"," paisagem"), então tudo o que lhe interessa é a relação largura / altura. (como a resposta de @bpedit)
Quando se divide a largura pela altura, se o resultado for inferior a 1, então o ecrã principal ou contentor ou o que quer que seja está no modo "retrato". Se o resultado for maior que 1, é uma pintura de "paisagem". ;)
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")
}
}
(Eu suponho que se você usar esta abordagem, então você provavelmente não cuidado com o manuseio específico da condição quando a relação é exatamente 1, largura e altura iguais.)
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
print("landscape")
} else {
print("portrait")
}
}
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
if (toInterfaceOrientation.isLandscape) {
NSLog("Landscape");
}
else {
NSLog("Portrait");
}
}
Swift 3 , baseado na resposta de Rob
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if (size.width / size.height > 1) {
print("landscape")
} else {
print("portrait")
}
}