(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
同样,我的目标是获取当前的设备方向,并在条件下进行测试。 Pseudocoded:
var o = (get device orientation)
if (o == portrait ) { ... } else { ... }
正如你所看到的,我在杂草中......任何帮助都会非常感激。
编辑:我确实设法让它与以下内容合作:var o = UIApplication.sharedApplication().statusBarOrientation;
if (o.isLandscape) { ...
但是,在初始加载时,当设备旋转为横向时,o.isLandscape
报告为false
。
搜索“UIViewController”的文档,并查看“配置视图旋转设置”。在Discussion
下,“不要使用此属性来通知布局决策。而是使用 UIApplication Class Reference中描述的statusBarOrientation
属性。”
搜索“UIApplication”文档并查看子类注释
答案 0 :(得分:10)
这里似乎有一些问题我会尽力清理。首先,以下内容不会创建UIApplication的实例,只是该类型的变量:
var o: UIApplication
如果要创建UIApplication的实例,您应该这样做:
let o: UIApplication = UIApplication()
但是,正如您所发现的,这不适用于UIApplication
;您不应该创建其他UIApplication实例。相反,您应该访问单例实例sharedApplication()
:
let o: UIApplication = UIApplication.sharedApplication()
注意:您的方向变量与使用app 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
}
}
同时强>
您需要指定您的应用可以支持横向方向。这可以通过应用程序摘要中的方向复选框完成,也可以通过视图控制器支持的方向方法以编程方式完成(您可以在线查找大量内容)。
答案 1 :(得分:6)
这适用于Xcode 6.1以避免条件绑定中的" Bound值必须是可选类型UIApplication"使用if let语句时发生的错误。
let orientation = UIApplication.sharedApplication().statusBarOrientation
if orientation.isPortrait {
// Portrait
} else {
// Landscape
}