使用statusBarOrientation的iPad设备方向

kmi*_*las 5 xcode orientation ipad ios swift

(Xcode 6,Swift,iOS8)

我试图找到iPad的设备方向,它似乎是不必要的复杂.我哪里错了?

起初,我尝试使用interfaceOrientation我的UIViewController,但它不可靠并且已弃用.Apple建议使用statusBarOrientation属性.(1)

statusBarOrientation属于类型UIApplication.我试图像这样创建一个实例:

var o: UIApplication
Run Code Online (Sandbox Code Playgroud)

然后测试:

if (o.statusBarOrientation.isLandscape) { ... }
Run Code Online (Sandbox Code Playgroud)

但收到错误

Variable 'o' used before being initialized.
Run Code Online (Sandbox Code Playgroud)

这对我毫无意义.为什么我要将它初始化为一个值?我会覆盖我想要的价值!?

然后我尝试按照文档中的建议创建一个变量:

var statusBarOrientation: UIInterfaceOrientation
Run Code Online (Sandbox Code Playgroud)

但是跟踪:

statusBarOrientation =(UIKit.UIInterfaceOrientation)(0xa0)

所以我尝试将UIApplication子类化,并通过我的子类访问该属性.

从这里开始,更加复杂.似乎"每个应用程序必须只有一个UIApplication实例(或UIApplication的子类)." (2)

这导致我发表以下帖子,这似乎Main在Swift中创建了一个例程?!
使用Swift子类UIApplication

同样,我的目标是获取当前的设备方向,并在条件下进行测试.Pseudocoded:

var o = (get device orientation)
if (o == portrait ) { ... } else { ... }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我在杂草中...任何帮助都将非常感激.

编辑:我确实设法让它与以下工作类似:

var o = UIApplication.sharedApplication().statusBarOrientation;
if (o.isLandscape) { ...
Run Code Online (Sandbox Code Playgroud)

但是,在初始加载时,当设备旋转到横向时,o.isLandscape报告为false.

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

  2. 搜索"UIApplication"的文档并查看Subclassing notes

Mic*_*lum 10

这里似乎有一些问题我会尽力清理.首先,以下内容不会创建UIApplication的实例,只是该类型的变量:

var o: UIApplication
Run Code Online (Sandbox Code Playgroud)

如果要创建UIApplication的实例,您应该这样做:

let o: UIApplication = UIApplication()
Run Code Online (Sandbox Code Playgroud)

但是,正如你所发现的,这不会起作用UIApplication; 您不应该创建其他UIApplication实例.相反,您应该访问单例实例,sharedApplication():

let o: UIApplication = UIApplication.sharedApplication()
Run Code Online (Sandbox Code Playgroud)

注意: 您的方向变量与使用app delegate变量时遇到的问题相同.以下行没有说明要将哪个值放入变量statusBarOrientation; 它没有初始化:

var statusBarOrientation: UIInterfaceOrientation
Run Code Online (Sandbox Code Playgroud)

这些行中的任何一行都符合您的意图:

var statusBarOrientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
var o: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
let orientation = UIApplication.sharedApplication().statusBarOrientation
Run Code Online (Sandbox Code Playgroud)

无论如何,当你把它们放在一起时,你可以通过以下方式获得当前的状态栏方向.

if let theAppDelegate = UIApplication.sharedApplication() {
    let orientation = theAppDelegate.statusBarOrientation

    if orientation.isPortrait {
        // Portrait
    } else {
        // Landscape
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要指定您的应用可以支持横向方向.这可以通过应用程序摘要中的方向复选框完成,也可以通过视图控制器支持的方向方法以编程方式完成(您可以在此处找到大量内容).


小智 6

这适用于Xcode 6.1,以避免使用if let语句时出现"条件绑定中的绑定值必须是可选类型UIApplication"错误.

let orientation = UIApplication.sharedApplication().statusBarOrientation

    if orientation.isPortrait {
        // Portrait
    } else {
        // Landscape
    }
Run Code Online (Sandbox Code Playgroud)