与父 UIView 容器的安全区域相比,如果相对于父 UIView 容器本身创建约束,是否有任何区别?

Is there any differences, if you create a constraint relative to parent UIView container itself, compared to safe area of parent UIView container?

目前,我有一个父级 UIView 容器,其中包含其他子级 UIView

我尝试了 2 种不同的方法来创建它们的约束


相对于父级 UI查看容器本身

  1. 尾随=主要Label.trailing + 10
  2. 主要 Label.leading = 前导 + 10
  3. Main.Label.centerY = 中心 Y


相对于父级UI查看容器的安全区域

  1. 安全 Area.trailing = 主要 Label.trailing + 10
  2. 主要Label.leading=安全Area.leading+10
  3. Main.Label.centerY = 安全 Area.centerY


它们在 Xcode XIB UI 预览中可能看起来不同,在安全区域似乎有上边距。

但是,当我 运行 应用程序时,两者都会产生相同的 UI 外观。

据我所知,当我们创建相对于父 UIView 容器本身的约束时,与父 UIView 容器的安全区域相比,有什么区别?大多数时候我们应该走哪条路?

SafeArea 只是 Apple 提供的布局指南,以避免您的视图或任何组件覆盖一些不需要的地方,例如状态栏或底部栏。

通常当我创建自定义 UIView 时,我总是将子视图与其父视图对齐。 (即创建一个相对于父 UIView 容器本身的约束),因为我知道我希望我的自定义 UIView 无论它们在哪里,即使它们靠近安全区域,都显示相同。

也许通过一些演示会更清楚:

所以我创建了两个自定义视图,标签以超级视图和安全区域为中心。

当您 运行 应用程序时它们看起来是一样的,但是当您将它们移动到安全区域时...

我们可以看到以安全区域为中心的标签向下移动,安全区域布局指南正在工作。 (当然我们可以获取状态栏的高度,对比一下两个标签的位置,应该可以看出两者的区别就是状态栏的高度,但这里我更愿意直观地解释一下。)

总而言之,我建议在创建自定义视图时创建相对于父视图的约束,在大多数情况下,以避免任何意外行为。