【问题标题】:InterfaceOrientation deprecated in iOS 8iOS 8 中不推荐使用 InterfaceOrientation
【发布时间】:2015-04-18 13:24:24
【问题描述】:

我没有在我的项目中使用 Size 类,而是继续使用旧方法来定位视图控制器。我收到弃用警告,例如当我使用以下代码时:

    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
      ...
    }

我搜索了很多,但找不到正确的方法来修复它。有什么建议吗?

【问题讨论】:

  • “修复”的方法是使用新方法。你为什么不想这样做?
  • "我没有在我的项目中使用 Size 类" 好吧,你的问题。与方向相关的信息通过traitCollection 作为尺寸等级传达给您。显然,如果你拒绝看它,你就看不到它。
  • 如何从 UITraitCollection 转换为 UIInterfaceOrientation ?例如,哪个特征集合是指横向左方向?

标签: ios8 uikit uiinterfaceorientation autorotate


【解决方案1】:

应该改变

if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
  ...
}

if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) {
  ...
}

【讨论】:

    【解决方案2】:

    从 iOS8 开始,Apple 建议使用 TraitCollections (Size Classes) 而不是 interfaceOrientation。

    此外,由于 iOS 9 和新 iPad 具有“多任务处理”功能,在某些情况下设备方向与窗口比例不匹配! (这会导致你的应用程序 UI 崩溃)

    但是,有时 TraitCollections 并不能满足您的所有设计需求。对于这些情况,Apple 建议比较视图的边界:

    if view.bounds.size.width > view.bounds.size.height {
        // ...
    }
    

    我很惊讶,但您可以在 21'15 观看 WWDC 2015 视频Getting Started with Multitasking on iPad in iOS 9

    【讨论】:

    • 但是我有一个问题,它无法区分横向左侧和横向右侧。我怎么得到它?
    • 你是对的@DeepakSharma,但是尺寸等级不允许你区分横向左侧和横向右侧。为什么需要这些信息?如果你想要设备方向而不是屏幕方向,你可以使用[[UIApplication sharedApplication] statusBarOrientation]
    【解决方案3】:

    有些人可能需要使用 UIDevice Orientation

    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
       ...
    }
    

    而不是状态栏方向

    if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) {
       ...
    }
    

    【讨论】:

    • 1. statusBarOrientation - 已弃用,2. 使用设备方向是错误的。例如,设备可以是纵向的,但界面可以是横向的。