xib文件中的安全区域布局指南 – iOS 10

我开始适应iPhone X的应用程序,并在Interface Builder中发现了一个问题。 根据官方的苹果video,安全区域布局指南应该是向后兼容的。 我发现它在故事板中工作得很好。

但在我的XIB文件中,安全区域布局指南在iOS 10中不受重视。

它们对于新的操作系统版本工作正常,但iOS 10设备似乎简单地假定安全区域距离为零(忽略状态栏大小)。

我是否缺less所需的configuration? 它是一个Xcode错误,如果是这样,任何已知的解决方法?

下面是testing项目中的问题截图(左侧iOS 10,右侧iOS 11):

屏幕顶部的安全区域对齐

安全区域布局和向后兼容性有一些问题。 在这里看到我的评论。

你可能能够解决这个问题,像1000优先级> = 20.0到superview.top和750优先级== safearea.top。 如果你总是显示一个状态栏,那应该修复一些东西。

一个更好的方法可能是在iOS 11和iOS-11之前分别创buildstoryboard / xibs,特别是遇到更多问题时。 更好的原因是因为在iOS 11之前,您应该对顶部/底部布局指南进行布局约束,但对于iOS 11,您应该将它们布局到安全区域。 布局指南消失了。 对于iOS 11之前的版面devise指南,在风格上要好于仅仅偏移20像素的分辨率,即使结果将是相同的IFF,你总是会显示一个状态栏。

如果采取这种方法,则需要将每个文件都设置为正确的部署目标(iOS 11或更早的版本),以便Xcode不会提供警告,并允许您使用布局指南或安全的地区,取决于。 在你的代码中,在运行时检查iOS 11,然后加载相应的storyboard / xibs。

这种方法的缺点是维护(你将有两套视图控制器来维护和保持同步),但是一旦你的应用程序只支持iOS 11+或者Apple修复了向后兼容的布局指南约束生成,你可以得到摆脱了iOS 11之前的版本。

顺便说一下,你如何显示你看到这个控制器? 它只是根视图控制器,或者你提出,或..? 我注意到的问题与推视图控制器,所以你可能会遇到不同的情况。

我最终删除了我的xib文件中的安全区域的约束。 相反,我提出了UIView的问题,并从代码我把它挂在这样,viewDidLayoutSubviews。

let constraint = alert.viewContents.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor, constant: 0) constraint.priority = 998 constraint.isActive = true 

这将一个小的“警报”绑定到屏幕上方,但要确保警报内的内容视图始终位于顶部安全区域(iOS11ish)/ topLayoutGuide(iOS10ish)之下,

简单和一次性的解决scheme。 如果有事打破了,我会回来的。

目前,向后兼容性不好。

我的解决scheme是在界面生成器中创build两个约束,并根据您使用的ios版本删除一个:

  • 对于ios 11: view.top == safe area.top
  • 对于早期版本: view.top == superview.top + 20

将它们分别作为myConstraintmyConstraintIOS10分别添加。 然后:

 override func viewDidLoad() { if #available(iOS 11.0, *) { view.removeConstraint(myConstraintIOS10) } else { view.removeConstraint(myConstraint) } } 

find最简单的解决scheme – 只需禁用safe area并使用topLayoutGuidebottomLayoutGuide +为iPhone X添加补丁。也许这不是一个漂亮的解决scheme,但需要尽可能less的努力