iPad设备方向使用statusBarOrientation

5

(Xcode 6,Swift,iOS8)

我试图找到iPad的设备方向,但似乎这是一个不必要复杂的过程。我错在哪里了?

起初,我尝试使用我的UIViewController的interfaceOrientation,但这是不可靠和已弃用的。苹果建议使用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
  1. 搜索“UIViewController”文档,并查看“配置视图旋转设置”。在“讨论”下,“不要使用此属性来通知布局决策。相反,请使用描述在UIApplication Class Reference中的statusBarOrientation属性。”

  2. 搜索“UIApplication”文档并查看子类说明。

2个回答

10

这里似乎有一些错误,我会尽力澄清。首先,以下代码并不创建UIApplication的实例,仅仅是声明了一个该类型的变量:

var o: UIApplication

如果你想创建一个UIApplication的实例,你应该这样做:

let o: UIApplication = UIApplication()

但是,正如您发现的那样,这对于UIApplication不起作用;您不应该创建额外的UIApplication实例。相反,您应该访问单例实例sharedApplication()

let o: UIApplication = UIApplication.sharedApplication()

注意: 你在方向变量上遇到了与应用代理变量相同的问题。下面这行代码 并没有指定 变量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. 这个在初始加载时不起作用。我正在我的导航控制器中的视图控制器的viewDidLoad()例程中调用它。
  2. 第四行有什么原因,为什么我不能使用orientation.isPortrait或orientation.isLandscape?非常感谢 :)
- kmiklas
@kmiklas 我不确定为什么会发生这种情况,而且我无法复现。在我的端上完全正常运行。对不起,那样也可以。我想我只是有些难以改掉一些旧习惯。 - Mick MacCallum
1
@kmiklas 实际上,你配置了横向或纵向方向的支持吗? - Mick MacCallum
1
@kmiklas 你需要指定你的应用程序支持横向方向。这可以通过应用程序摘要中的方向复选框或通过视图控制器的支持方向方法(你可以在网上找到很多相关信息)进行编程实现。无论如何,核心问题是你正在创建变量,但没有给它们赋值。当你写var o: UIApplication时,你指定了这个变量应该被称为o并具有UIApplication类型,但它从未被赋值。在var o: UIApplication = UIApplication()中,o是一个新创建的... - Mick MacCallum
@`0x7fffffff:实际上,你是否配置了横向方向的支持?我之前没有配置,但是在我配置后,应用程序可以正确地在任何视图中加载。再次非常感谢。 - kmiklas
显示剩余4条评论

6

使用Xcode 6.1可以避免使用if let语句时出现"在条件绑定中绑定的值必须是Optional类型UIApplication"错误。

let orientation = UIApplication.sharedApplication().statusBarOrientation

    if orientation.isPortrait {
        // Portrait
    } else {
        // Landscape
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接