it-swarm.com.de

Geräteorientierung in Swift abrufen

Ich habe mich gefragt, wie ich die aktuelle Geräteorientierung in Swift erhalten kann. Ich weiß, es gibt Beispiele für Objective-C, aber ich konnte es nicht in Swift zum Laufen bringen.

Ich versuche, die Geräteorientierung zu ermitteln und dies in eine if-Anweisung zu bringen.

Dies ist die Zeile, mit der ich die meisten Probleme habe:

[[UIApplication sharedApplication] statusBarOrientation]
57
user3746428

sie können verwenden:

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 Benachrichtigung können Sie Folgendes überprüfen: IOS8 Swift: Wie erkennt man Orientierungsänderungen?

HINWEIS:didRotateFromInterfaceOrientation ist veraltet. viewWillTransitionToSize für iOS 2.0 und höher

55
Miguel

Um die Statusleiste (und damit die Benutzeroberfläche) wie den Objective-C-Code zu ermitteln, den Sie haben, ist es einfach:

UIApplication.sharedApplication().statusBarOrientation

Sie können auch die orientation-Eigenschaft von UIDevice verwenden:

UIDevice.currentDevice().orientation

Dies stimmt jedoch möglicherweise nicht mit der Ausrichtung Ihrer Benutzeroberfläche überein. Aus den Dokumenten:

Der Wert der Eigenschaft ist eine Konstante, die den aktuellen Wert angibt Ausrichtung des Geräts. Dieser Wert steht für die physische Ausrichtung des Geräts und kann vom aktuellen Wert abweichen Orientierung der Benutzeroberfläche Ihrer Anwendung. Sehen "UIDeviceOrientation" für Beschreibungen der möglichen Werte.

45
Mike S

Apple hat kürzlich die Idee von Landscape vs. Portrait aufgegeben und bevorzugt die Bildschirmgröße. Dies funktioniert jedoch:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("landscape")
    } else {
        print("portrait")
    }
}
22
zSprawl
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
        }
    }
}}

Antwort von Swift4: So mache ich es, 

1. funktioniert für alle Arten von View-Controller

2.auch arbeiten, wenn der Benutzer die App dreht 

3. Installieren Sie die App zum ersten Mal

14
Ernie Cheng

Um die aktuelle Geräteorientierung zu ermitteln, verwenden Sie einfach diesen Code:

UIApplication.sharedApplication (). StatusBarOrientation

für Swift 3.0 

UIApplication.shared.statusBarOrientation

12
Usman Nisar

Swift 4:

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

Ich hatte Probleme mit der Verwendung von InterfaceOrientation. Es funktionierte gut, außer dass beim Laden die Ausrichtung nicht angezeigt wurde. Also habe ich es versucht und es ist ein Hüter. Dies funktioniert, weil der bounds.width sich immer auf die aktuelle Ausrichtung bezieht, im Gegensatz zu nativeBounds.width, der absolut ist.

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

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

Vielen Dank an zSprawl für den Zeiger in diese Richtung. Ich sollte darauf hinweisen, dass dies nur für iOS 8 und später gut ist.

8
bpedit

Wenn Apple also die gesamte Orientierungszeichenfolge ("Hochformat", "Querformat") ablehnt, ist das Verhältnis von Breite zu Höhe alles, was Sie interessieren. (irgendwie wie @ bpedit's Antwort)

Wenn Sie die Breite durch die Höhe teilen, wenn das Ergebnis weniger als 1 ist, dann ist der Hauptbildschirm oder Container oder was auch immer sich im "Hochformat" -Modus befindet. 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, wenn Sie diesen Ansatz verwenden, ist es Ihnen wahrscheinlich nicht wirklich wichtig, die Bedingung genau zu behandeln, wenn das Verhältnis genau 1 ist, gleich Breite und Höhe ist.)

7
Rob

Swift 3+

Grundsätzlich gilt:

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

:)

2
stakovereser

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")
    }
}
2
Johan Tingbacke
   override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        NSLog("Landscape");
    }
    else {
        NSLog("Portrait");
    }
}
2
Sanju

Ich fand den alternativen Code in Swift für den Obj-C-Code

if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 

ist

if UIApplication.shared.statusBarOrientation.isLandscape

Hinweis: Wir versuchen herauszufinden, ob die Ausrichtung der Statusleiste Querformat ist oder nicht. Wenn es sich um eine Landschaft handelt, ist die if -Anweisung wahr.

0
Akarsh SEGGEMU