2014-09-11 10 views
41

Ich habe mich gefragt, wie ich die aktuelle Geräteausrichtung in Swift bekommen kann? Ich weiß, dass es Beispiele für Objective-C gibt, aber ich konnte es nicht in Swift funktionieren lassen.Erste Geräteausrichtung in Swift

Ich versuche, die Geräteausrichtung zu bekommen und das in eine if-Anweisung zu setzen.

Das ist die Linie, die ich die meisten Probleme mit habe:

[[UIApplication sharedApplication] statusBarOrientation] 
+0

Was ist Ihr Problem? Das in Swift übersetzen oder die Werte bekommen, die du erwartest? –

+0

Die Geräteausrichtung stimmt nicht unbedingt mit der Ausrichtung Ihrer Benutzeroberfläche überein. Gehäuse - Legen Sie Ihr Gerät flach und testen Sie Ihren Code! – Patrick

Antwort

33

Um die Statusleiste (und daher UI) Orientierung wie der Objective-C-Code Sie haben, ist es einfach zu bekommen:

UIApplication.sharedApplication().statusBarOrientation 

Sie können auch die orientation property von UIDevice verwenden:

UIDevice.currentDevice().orientation 

jedoch, dass möglicherweise nicht t entspricht, welche Ausrichtung der Benutzeroberfläche ist in den Dokumenten.

Der Wert der Immobilie ist eine Konstante, die die aktuelle Ausrichtung des Geräts zeigt. Dieser Wert entspricht der physischen Ausrichtung des Geräts und kann sich von der aktuellen Ausrichtung der Benutzeroberfläche Ihrer Anwendung unterscheiden. Eine Beschreibung der möglichen Werte finden Sie unter "UIDeviceOrientation".

47

können Sie:

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)")   
} 

oder

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

mit Notification können Sie überprüfen: IOS8 Swift: How to detect orientation change?

HINWEIS:didRotateFromInterfaceOrientation ist Veraltete Verwenden viewWillTransitionToSize für iOS 2.0 und höher

16

von Apple wurde vor kurzem von der Idee der Landschaft vs. Portrait los und zieht wir Bildschirmgröße verwenden. Dies funktioniert jedoch:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    if UIDevice.currentDevice().orientation.isLandscape.boolValue { 
     print("landscape") 
    } else { 
     print("portrait") 
    } 
} 
+4

Ich würde mit Ihrer Lösung feststellen, Apple sagt: "Wenn Sie diese Methode in Ihren benutzerdefinierten Ansicht Controller überschreiben, rufen Sie immer Super in einem Punkt in Ihrer Implementierung" – Popmedic

2
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 
    if (toInterfaceOrientation.isLandscape) { 
     NSLog("Landscape"); 
    } 
    else { 
     NSLog("Portrait"); 
    } 
} 
7

ich bei der Verwendung von InterfaceOrientation Probleme hatte, funktionierte es OK, außer es nicht um die Orientierung beim Laden Zugriff wurde. Also habe ich das versucht und es ist ein Hüter. Dies funktioniert, weil die bounds.width immer in Bezug auf die aktuelle Ausrichtung im Gegensatz zu nativeBounds.width, die absolut ist.

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

Ich nenne dies von willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) und von viewDidLoad aber flexibel.

Dank zSprawl für den Zeiger in dieser Richtung. Ich sollte darauf hinweisen, dass dies nur für iOS 8 und höher geeignet ist.

+0

funktioniert nicht auf iOS 9 & 10 iPads, nur der ursprüngliche Wert ist richtig, Alle folgenden Werte sind entgegengesetzte Orientierung. –

+0

@ Steven.B Hmmm ... funktioniert gut auf meinem iPad Air, iPad 3 und Simulator unter iOS 9. Auch mit Beta-Testern gearbeitet. Vielleicht verwenden Sie auch anderen Code, der dies beeinflusst. – bpedit

+0

Dieser Code funktioniert wahrscheinlich nur, wenn er in einem UIViewcontroller verwendet wird. Ich versuche die Ausrichtung und Grenzen in einer benutzerdefinierten UIView-Klasse zu finden, aber fast jedes Gerät gibt unterschiedliche Werte zurück, wenn die Ausrichtung korrekt ist oder der Rahmen oder die Grenzen immer noch falsch sind . –

6

Also, wenn Apple die ganze Ausrichtung Zeichenfolge Ding ("Porträt", "Landschaft"), ist alles, was Sie kümmern, ist das Verhältnis von Breite zu Höhe. (ähnlich wie @ bpedits Antwort)

Wenn Sie die Breite durch die Höhe teilen, wenn das Ergebnis kleiner als 1 ist, dann ist der Hauptbildschirm oder Container oder was auch immer im "Hochformat" -Modus. Wenn das Ergebnis größer als 1 ist, handelt es sich um ein Landschaftsbild. ;)

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") 
    } 
} 

(Ich vermute, dass, wenn Sie diesen Ansatz dann wirklich speziell Sie wahrscheinlich nicht darum, den Zustand der Handhabung, wenn das Verhältnis genau 1 ist, die gleiche Breite und Höhe)

10

. Um einfach aktuelle Geräteausrichtung verwendet diesen Code:.

UIApplication.sharedApplication() statusBarOrientation

für eine schnelles 3.0

UIApplication.shared.statusBarOrientation

+0

iPad Air 1 & 2 gibt falschen Wert zurück, iPad 2 und iPhone sind korrekt. Ich versuche wirklich, einen zu finden, der auf allen Geräten funktioniert, aber Apple hat hier ein echtes Chaos verursacht! :( –

+0

im Gegensatz zu 'UIDevice.current.orientation',' UIApplication.shared.statusBarOrientation ist beim ersten Laden verfügbar, nicht erst nachdem der Bildschirm gedreht wurde. – ewizard

2

Swift 3, basierend auf Robs Antwort

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    if (size.width/size.height > 1) { 
     print("landscape") 
    } else { 
     print("portrait") 
    } 
} 
6
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 Antwort: das ist, wie ich es tun,

1. funktioniert für alle Verwandten ds-View-Controller

2.auch Arbeit, wenn der Benutzer die App

3.also zum ersten Mal installieren Sie die App

+0

funktioniert perfekt in swift 4. danke –

+0

perfekte Antwort! Vielen Dank – torap

2

Swift 4 dreht:

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