我想知道如何在Swift中获得当前的设备方向?我知道有一些Objective-C的示例,但是我无法在Swift中运行它。
我正在尝试确定设备方向,并将其放入if语句中。
这是我遇到最多问题的那条线:
[[UIApplication sharedApplication] statusBarOrientation]
Answers:
您可以使用:
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) {
}
使用Notification,您可以检查:IOS8 Swift:如何检测方向变化?
注意: 不推荐使用didRotateFromInterfaceOrientation,对于iOS 2.0和更高版本,请使用 viewWillTransitionToSize
如果是正面朝上和正面朝下,则将无法使用。因此,我们需要使用以下内容。
if UIApplication.shared.statusBarOrientation.isLandscape {
// activate landscape changes
} else {
// activate portrait changes
}
super.didRotate(from: fromInterfaceOrientation)
。来自Apple文档:“此方法的实现必须在执行过程中的某个时刻调用super。”
要像您拥有的Objective-C代码那样获得状态栏(以及UI)的方向,只需:
UIApplication.sharedApplication().statusBarOrientation
您还可以使用UIDevice的orientation
属性:
UIDevice.currentDevice().orientation
但是,这可能与您的UI所处的方向不符。从文档中:
该属性的值是一个常数,指示设备的当前方向。此值代表设备的物理方向,并且可能与应用程序用户界面的当前方向不同。有关可能值的说明,请参见“ UIDeviceOrientation”。
苹果公司最近摆脱了“风景vs人像”的概念,更喜欢我们使用屏幕尺寸。但是,这可行:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
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.也第一次安装该应用程序
斯威夫特4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
print("landscape")
} else {
print("portrait")
}
}
要查找当前的设备方向,只需使用以下代码:
UIApplication.sharedApplication()。statusBarOrientation
快速3.0
UIApplication.shared.statusBarOrientation
UIDevice.current.orientation
,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及更高版本有用。
因此,如果Apple不赞成使用整个方向字符串(“纵向”,“横向”),那么您所关心的只是宽高比。(有点像@bpedit的答案)
用宽度除以高度时,如果结果小于1,则mainScreen或容器或“纵向”“模式”中的任何内容。如果结果大于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,即宽度和高度相等时,您可能根本就不关心具体处理条件。)
super.viewWillAppear(animated)
并且super.viewWillTransition(to: size, with: coordinator)
在某些时候使用了覆盖函数
迅捷3+
基本上:
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")
}
}
:)
func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
因为traitcollection始终为width.regular
and height.regular
,因此traitCollection不会在旋转时发生变化。在Swift 4中,通知已重命名为UIDevice.orientationDidChangeNotification
。
Swift 3,基于Rob的回答
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if (size.width / size.height > 1) {
print("landscape")
} else {
print("portrait")
}
}
super.viewWillTransition(to: size, with: coordinator)
在您的覆盖函数中的某个时刻调用
statusBarOrientation被弃用,因此没有再提供在使用像上述的答案
在此代码中,无需担心折旧即可获得方向。Swift 5 ioS 13.2已测试100%
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)!
}
}
}