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