ios - 使用 statusBarOrientation 的 iPad 设备方向

标签 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

同样,我的目标是获取当前的设备方向,并在有条件的情况下对其进行测试。伪代码:

var o = (get device orientation)
if (o == portrait ) { ... } else { ... }

如您所见,我身处险境……非常感谢任何帮助。

编辑:我确实设法通过以下方式让它工作:

var o = UIApplication.sharedApplication().statusBarOrientation;
if (o.isLandscape) { ...

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

  1. 搜索“UIViewController”文档,然后查看“配置 View 旋转设置”。在 Discussion 下,“不要使用此属性来通知布局决策。而是使用 statusBarOrientation 属性,如 UIApplication 类引用中所述。

  2. 在文档中搜索“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/

相关文章:

iOS 删除或转移保留的应用配置文件

iphone - 为什么更改 UIScrollView 的框架会更改其 subview 的框架?

iphone - 将 xcode 4.6 iPhone 应用程序转换为通用应用程序

iOS 旋转中心按钮

C++/OpenGL,绘制随机字符到屏幕

javascript - 为什么 String.prototype.replace 从我的字符串中删除 "$' "?

c++ - 在 Xcode 4 中编写 C++

ios - ios Appstore 中的下载量是如何计算的

ios - 如何在具有多个子选择的 ReSwift 中定义 `newState`?

ios - 安装多个 Xcode 后 Open Podfile 无法正常工作