在Swift中获取设备方向

我想知道如何在Swift中获得当前的设备定位? 我知道有Objective-C的例子,但是我还没有能够在Swift中工作。

我正在尝试获取设备方向并将其放入if语句中。

这是我遇到的最多问题:

[[UIApplication sharedApplication] statusBarOrientation] 

您可以使用:

 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更新

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

要么

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

通知您可以检查: IOS8 Swift:如何检测方向更改?

注: didRotateFromInterfaceOrientation已弃用在iOS 2.0及更高版本中使用viewWillTransitionToSize

为了获得状态栏(及其UI)的方向,就像你所拥有的Objective-C代码一样,它只是简单的:

 UIApplication.sharedApplication().statusBarOrientation 

您也可以使用UIDevice的orientation属性 :

 UIDevice.currentDevice().orientation 

但是,这可能不符合您的用户界面的方向。从文档:

该属性的值是一个常数,表示设备的当前方向。 该值表示设备的物理方向,可能与应用程序用户界面的当前方向不同。 有关可能值的说明,请参阅“UIDeviceOrientation”。

苹果最近摆脱了景观与人像的想法,并更喜欢我们使用屏幕大小。 但是,这工作:

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

要find当前的设备方向,只需使用以下代码:

UIApplication.sharedApplication()。statusBarOrientation

为迅速3.0

UIApplication.shared.statusBarOrientation

我有使用InterfaceOrientation问题,它工作正常,除非它不访问加载方向。 所以我试了这个,它是一个守门员。 这是有效的,因为bounds.width总是参考当前的方向,而nativeBounds.width是绝对的。

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

我从willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval)viewDidLoad调用它,但它很灵活。

感谢zSprawl在这个方向的指针。 我应该指出,这只适用于iOS 8及更高版本。

所以,如果苹果贬低整个定位string的东西(“人像”,“风景”),那么你所关心的只是宽高比。 (有点像@ bpedit的答案)

当用高度除以宽度时,如果结果小于1,则mainScreen或container或任何处于“portrait”模式的东西。 如果结果大于1,则是“风景”画。 ;)

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

(我猜如果你使用这种方法,那么当比例正好等于1,宽度和高度相等时,你可能并不真正关心具体处理条件。)

 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回答:这是我怎么做的,

1.为各种视图控制器工作

2.当用户旋转应用程序时也工作

3.也是第一次安装应用程序

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

Swift 3 ,根据Rob的回答

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { if (size.width / size.height > 1) { print("landscape") } else { print("portrait") } } 

Swift 4:

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