【问题标题】:Cannot rotate interface orientation to portrait upside down on iPhone X无法在 iPhone X 上将界面方向旋转为纵向倒置
【发布时间】:2018-03-16 18:26:55
【问题描述】:

我们有一个应用程序使用连接到音频插孔(或 iPhone7 或更高版本中的闪电端口)的附件。它需要以特定方向运行,具体取决于 iOS 设备。

目前在任何 iPhone 的模拟器或实际设备中设置设备方向都没有问题,iPhoneX 模拟器除外。

当前设置方向的代码:

- (BOOL)shouldAutorotate {
    return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    //device checks omitted
    return UIInterfaceOrientationMaskPortraitUpsideDown;
}

Target settings with orientations enabled

堆栈跟踪:

TF uncaught exception reason : Supported orientations has no common orientation with the application, and [RootNavigationController shouldAutorotate] is returning YES
2017-10-05 09:35:02.692945+0200 [65045:74145368] *** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [RootNavigationController shouldAutorotate] is returning YES'

这适用于 iPhone5、iPhone6、iPhone6+、iPhone7 和 iPhone7+ 设备以及 iPhone8 模拟器。这似乎也不是 iOS11 的问题,因为我的 iPhone7 目前正在运行 iOS11。我目前唯一遇到问题的设备是 iPhoneX 模拟器。

【问题讨论】:

  • 在 iOS 11.2 上 shouldAutorotate 不再被调用。所有旧的旋转代码似乎都已被弃用:UIViewController 的文档中的“从 iOS 8 开始,所有与旋转相关的方法都已弃用”。我也很难避免在 iPhone X 上旋转。

标签: ios objective-c xcode9 iphone-x


【解决方案1】:

iPhone X 似乎不支持倒置;见https://forums.developer.apple.com/message/268015。一位 Apple 员工说:“这是设计使然。我们将在未来的版本中更新文档以反映这一点。”

至少在模拟中,您仍然会收到方向更改通知,但正如您发现的那样,如果您采取行动,可能会发生坏事。就我而言,我没有遇到异常,但我的 UI 没有正确重绘。

我正在添加代码来检测倒置的 iPhone X 并防止 UI 重绘;它可以在 sim 中运行,我们将不得不等待,看看它是否可以在真实设备上运行(幸运的是,我的颠倒用例仅涉及耳机插孔设备,因此在 iPhone X 上失去颠倒对我来说没什么大不了的)。

结果是,我们这些使用照明端口传感器的人将无法为 iPhone X 用户提供与“较小”的 iPhone 相同的可用性,至少在没有一些非常乏味的 UI 谜题的情况下不会涉及大量仿射变换来旋转和/或翻转元素以显示上下颠倒,同时仍然符合手机认为它正在在做什么。叹息。

【讨论】:

  • 我猜苹果太懒了,没有想出有意义的方法来调整 iPhone X 的 split 状态栏的布局,使其显示在无缺口的底部边缘屏幕。
  • 我猜对苹果来说太多了! View.preservesSuperviewLayoutMargins (iOS8+), layoutMarginsDidChange(iOS8+), VC.layoutMargins(dep.)→View.directionalLayoutMargins(iOS11), VC.viewLayoutMarginsDidChange(iOS11), VC.systemMinimumLayoutMargins(iOS11), VC.viewRespectsSystemMinimumLayoutMargins(iOS11), View.safeAreaInsets(iOS11), insetsLayoutMarginsFromSafeArea(iOS11), VC.viewSafeAreaInsetsDidChange (iOS11), View.safeAreaLayoutGuide(iOS11) VC.additionalSafeAreaInsets(iOS11) - 我给,没有 iPhoneX 倒置!
  • 似乎这个“功能”已经进入了 HIG:developer.apple.com/ios/human-interface-guidelines/… ...当用户将设备旋转 180 度时,仅在纵向模式下运行的应用程序应该将其内容旋转 180 度—— iPhone X 除外,它不支持倒置纵向模式。如果您的应用在有人以错误方向握持设备时没有自动旋转,他们会本能地知道要旋转它。你不需要告诉他们。 很好,这是一个用户错误。
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多