(Xcode 6、Swift、iOS8)
我正在尝试查找 iPad 的设备方向,它似乎不必要地复杂。我哪里错了?
起初,我尝试使用 UIViewController 的 interfaceOrientation
,但它不可靠且已弃用。 Apple 建议使用 statusBarOrientation 属性。 (1)
statusBarOrientation 是 UIApplication
类型。我试图创建一个这样的实例:
var o: UIApplication
然后测试:
if (o.statusBarOrientation.isLandscape) { ... }
但收到错误
Variable 'o' used before being initialized.
这对我来说毫无意义。为什么要将它初始化为一个值?我会覆盖我想要的值!?
然后我尝试按照文档中的建议简单地创建一个变量:
var statusBarOrientation: UIInterfaceOrientation
但有迹可循:
statusBarOrientation = (UIKit.UIInterfaceOrientation) (0xa0)
所以我尝试子类化 UIApplication,并通过我的子类访问该属性。
从这里开始,更加复杂。似乎“每个应用程序都必须只有一个 UIApplication 实例(或 UIApplication 的子类)”。 (2)
这让我看到了以下帖子,它似乎在 Swift 中创建了一个 Main
例程?!
Subclass UIApplication with Swift
同样,我的目标是获取当前的设备方向,并在有条件的情况下对其进行测试。伪代码:
var o = (get device orientation)
if (o == portrait ) { ... } else { ... }
如您所见,我身处险境……非常感谢任何帮助。
编辑:我确实设法通过以下方式让它工作:
var o = UIApplication.sharedApplication().statusBarOrientation;
if (o.isLandscape) { ...
但是,在初始加载时,当设备旋转到横向时,o.isLandscape
被报告为 false
。
搜索“UIViewController”文档,然后查看“配置 View 旋转设置”。在
Discussion
下,“不要使用此属性来通知布局决策。而是使用statusBarOrientation
属性,如 UIApplication 类引用中所述。”在文档中搜索“UIApplication”并查看子类注释
最佳答案
这里似乎有几处错误,我将尝试解决。首先,以下内容不会创建 UIApplication 的实例,而只会创建该类型的变量:
var o: UIApplication
如果你想创建一个 UIApplication 的实例,你应该这样做:
let o: UIApplication = UIApplication()
但是,正如您发现的那样,这对 UIApplication
不起作用;你不应该创建额外的 UIApplication 实例。相反,您应该访问单例实例 sharedApplication()
:
let o: UIApplication = UIApplication.sharedApplication()
注意:您在方向变量方面遇到的问题与在应用程序委托(delegate)变量方面遇到的问题相同。下面这行没有说明要将什么值放入变量statusBarOrientation
;它没有被初始化:
var statusBarOrientation: UIInterfaceOrientation
这些行中的任何一行都符合您的预期:
var statusBarOrientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
var o: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
let orientation = UIApplication.sharedApplication().statusBarOrientation
无论如何,当你把它们放在一起时,你可以通过以下方式获得当前状态栏的方向。
if let theAppDelegate = UIApplication.sharedApplication() {
let orientation = theAppDelegate.statusBarOrientation
if orientation.isPortrait {
// Portrait
} else {
// Landscape
}
}
还有
您需要指定您的应用可以支持横向。这可以通过应用程序摘要中的方向复选框来完成,也可以通过 View Controller 支持的方向方法以编程方式完成(您可以在网上找到很多)。
关于ios - 使用 statusBarOrientation 的 iPad 设备方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24312414/