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

Tia*_*ira 64 ios ios10 xcode9 iphone-x

我开始为iPhone X调整我的应用程序,并在Interface Builder中发现了一个问题.根据官方Apple视频,安全区域布局指南应该向后兼容.我发现它在故事板中运行得很好.

但在我的XIB文件中,iOS 10中不遵守安全区域布局指南.

它们适用于新的操作系统版本,但iOS 10设备似乎只是假设安全区域距离为零(忽略状态栏大小).

我错过了任何必要的配置吗?这是一个Xcode错误,如果是这样,任何已知的解决方法?

以下是测试项目中的问题的屏幕截图(左侧iOS 10,右侧iOS 11):

屏幕顶部的安全区域对齐

cla*_*rus 70

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

您可以使用其他约束解决问题,例如1000优先级> = 20.0到superview.top和750优先级== safearea.top.如果你总是显示状态栏,那应该解决问题.

一个更好的方法可能是为iOS 11之前和iOS-11及更高版本提供单独的故事板/ xib,特别是如果遇到的问题多于此问题.最好的原因是因为在iOS 11之前你应该将限制布局到顶部/底部布局指南,但是对于iOS 11,你应该将它们放到安全区域.布局指南消失了.对于iOS 11之前的布局指南,在风格上比仅仅偏移20像素更好,即使结果与IFF相同,您总是会显示状态栏.

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

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

顺便问一下,你如何显示你正在看到的控制器?它只是根视图控制器还是你提出它,还是......?我注意到的问题与推动视图控制器有关,所以你可能会遇到不同的情况.

  • 那是个很好的观点.我只处理我正在使用的应用程序的肖像.对于iOS 11,无论如何都没有理由拥有这种约束.这听起来像是一个很好的解决方案,或者以编程方式为<ios 11添加顶部布局指南约束,并且不总是具有> = 20的约束. (2认同)

Mar*_*era 14

目前,向后兼容性不能很好地工作.

我的解决方案是在界面构建器中创建2个约束,并根据您使用的ios版本删除一个约束:

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

他们两人加为网点的myConstraintSAFEAREAmyConstraintSUPERVIEW分别.然后:

override func viewDidLoad() {
    if #available(iOS 11.0, *) {
        view.removeConstraint(myConstraintSUPERVIEW)
    } else {
        view.removeConstraint(myConstraintSAFEAREA)
    }
}
Run Code Online (Sandbox Code Playgroud)


Fal*_*ler 5

对我来说,使它在两个版本上均能正常工作的简单解决方法是

    if #available(iOS 11, *) {}
    else {
        self.edgesForExtendedLayout = []
    }
Run Code Online (Sandbox Code Playgroud)

从文档中:“在iOS 10和更早版本中,使用此属性报告视图控制器的哪些边缘在导航栏或其他系统提供的视图下延伸。”。所以将它们设置为空数组可以确保视图控制器并不能延长下方的导航栏。

Docu 在这里可用

  • 不幸的是,这仅在导航栏可见时才有效。如果隐藏导航栏,视图仍将通过“edgesForExtendedLayout = []”在状态栏下方扩展 (2认同)