Obter a orientação do dispositivo no Swift

Estava a pensar Como posso obter a orientação actual do dispositivo no Swift? Sei que há exemplos para o Objective-C, mas não consegui pô-lo a funcionar no Swift.

Estou a tentar obter a orientação do dispositivo e colocá-la numa declaração de se.

esta é a linha com a qual tenho mais problemas:

[[UIApplication sharedApplication] statusBarOrientation]
Author: user3746428, 2014-09-12

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

 53
Author: Miguel, 2017-08-25 04:01:36

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.

 41
Author: Mike S, 2014-09-11 20:43:44
A Apple livrou-se recentemente da ideia de Paisagem vs. retrato e prefere que usemos o tamanho do ecrã. No entanto, isto funciona:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("landscape")
    } else {
        print("portrait")
    }
}
 20
Author: zSprawl, 2015-06-28 23:32:05

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

 12
Author: Usman Nisar, 2016-09-30 12:52:49
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

 9
Author: Ernie Cheng, 2017-09-17 15:50:03
Tive problemas com o uso, funcionou bem, só que não estava a aceder à orientação do Carregamento. Por isso, tentei isto e é para guardar. Isto funciona porque o 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.
 7
Author: bpedit, 2016-03-13 06:22:14

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.)
 7
Author: Rob, 2017-07-18 00:53:58

Swift 4:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            print("landscape")
        } else {
            print("portrait")
        }
    }
 7
Author: FBC, 2017-10-23 13:48:32
   override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        NSLog("Landscape");
    }
    else {
        NSLog("Portrait");
    }
}
 2
Author: Sanju, 2015-12-14 09:42:56

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")
    }
}
 2
Author: Johan Tingbacke, 2017-01-26 12:57:20