使用statusBarOrientation的iPad设备方向

时间:2014-06-19 17:06:52

标签: ios xcode ipad orientation swift

(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

  1. 搜索“UIViewController”的文档,并查看“配置视图旋转设置”。在Discussion下,“不要使用此属性来通知布局决策。而是使用 UIApplication Class Reference中描述的statusBarOrientation属性。

  2. 搜索“UIApplication”文档并查看子类注释

2 个答案:

答案 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
    }