Ich habe mich gefragt, wie ich die aktuelle Geräteorientierung in Swift erhalten kann. Ich weiß, dass es Beispiele für Objective-C gibt, aber ich konnte es in Swift nicht zum Laufen bringen.
Ich versuche, die Geräteorientierung zu ermitteln und diese in eine if-Anweisung einzufügen.
Dies ist die Zeile, mit der ich die meisten Probleme habe:
[[UIApplication sharedApplication] statusBarOrientation]
ios
swift
orientation
user3746428
quelle
quelle
Antworten:
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 überprüfen: IOS8 Swift: Wie erkennt man Orientierungsänderungen?
Im Falle von Face Up und Face Down funktioniert dies nicht. Wir müssen also Folgendes verwenden.
if UIApplication.shared.statusBarOrientation.isLandscape { // activate landscape changes } else { // activate portrait changes }
quelle
super.didRotate(from: fromInterfaceOrientation)
. Aus der Apple-Dokumentation: "Ihre Implementierung dieser Methode muss irgendwann während ihrer Ausführung super aufrufen."Um die Ausrichtung der Statusleiste (und damit der Benutzeroberfläche) wie den von Ihnen verwendeten Objective-C-Code zu erhalten, 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:
quelle
Apple hat kürzlich die Idee von Landscape vs. Portrait losgeworden und bevorzugt die Verwendung der Bildschirmgröße. Dies funktioniert jedoch:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { if UIDevice.currentDevice().orientation.isLandscape.boolValue { print("landscape") } else { print("portrait") } }
quelle
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: So mache ich das,
1. funktioniert für alle Arten von View Controllern
2. funktioniert auch, wenn der Benutzer die App dreht
3. Installieren Sie auch zum ersten Mal die App
quelle
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { if UIDevice.current.orientation.isLandscape { print("landscape") } else { print("portrait") } }
quelle
Verwenden Sie einfach diesen Code, um die aktuelle Geräteorientierung zu ermitteln:
für schnelle 3.0
quelle
UIDevice.current.orientation
,UIApplication.shared.statusBarOrientation
auf Anfangslast vorhanden ist, nicht nur , nachdem der Bildschirm gedreht wird.Ich hatte Probleme mit der Verwendung
InterfaceOrientation
, es funktionierte einwandfrei, außer dass beim Laden nicht auf die Ausrichtung zugegriffen wurde. Also habe ich es versucht und es ist ein Wächter. Dies funktioniert, weil sich dasbounds.width
immer auf die aktuelle Ausrichtung bezieht und nichtnativeBounds.width
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 nach,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 höher gut ist.
quelle
Wenn Apple also die gesamte Orientierungszeichenfolge ("Hochformat", "Querformat") ablehnt, ist das Verhältnis von Breite zu Höhe alles, was Sie interessiert. (irgendwie wie die Antwort von @ bpedit)
Wenn Sie die Breite durch die Höhe teilen und das Ergebnis kleiner als 1 ist, befindet sich 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, wenn Sie diesen Ansatz verwenden, ist es Ihnen wahrscheinlich nicht wirklich wichtig, die Bedingung speziell zu behandeln, wenn das Verhältnis genau 1 ist, gleiche Breite und Höhe.)
quelle
super.viewWillAppear(animated)
undsuper.viewWillTransition(to: size, with: coordinator)
irgendwann in Ihren übergeordneten FunktionenSwift 3+
Grundsätzlich:
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") } }
:) :)
quelle
func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
als traitcollection wird immerwidth.regular
undheight.regular
damit die traitCollection nicht auf Rotation ändern. In Swift 4 wurde die Benachrichtigung in umbenanntUIDevice.orientationDidChangeNotification
.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") } }
quelle
super.viewWillTransition(to: size, with: coordinator)
irgendwann in Ihrer übergeordneten FunktionIch fand, dass der alternative 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.
quelle
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { if (toInterfaceOrientation.isLandscape) { NSLog("Landscape"); } else { NSLog("Portrait"); } }
quelle
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.windows.first?.windowScene?.interfaceOrientation.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.windows.first?.windowScene?.interfaceOrientation.isPortrait)! } } }
quelle