3

当我试图创建布局约束时,我读到了 NSLayoutAnchor 类。他们说:

笔记

UIView 不提供布局边距属性的锚属性。相反, layoutMarginsGuide 属性提供了一个 UILayoutGuide 对象来表示这些边距。使用指南的锚属性来创建您的约束

好的。但同时我为没有 UILayoutGuide 属性的布局边距属性创建了锚属性。

     let inputsContainerView = UIView()
    inputsContainerView.backgroundColor = UIColor.white
    inputsContainerView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(inputsContainerView)

    //need x,y,width,height constraints
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -24).isActive = true
    inputsContainerView.heightAnchor.constraint(equalToConstant: 150).isActive = true

那么为什么我们需要 UILayoutGuide 对象呢?事实证明 UIView 确实为布局边距属性提供了锚属性?如果有人知道任何事情,我将不胜感激。

4

1 回答 1

12

这取决于您的设计要求。

layoutMarginsGuide文档状态

表示视图边距的布局指南。使用此布局指南的锚点创建具有视图边距的约束。

布局边距基本上只是视图的安全区域

安全区域可帮助您将视图放置在整个界面的可见部分中。UIKit 定义的视图控制器可能会将特殊视图放置在您的内容之上。例如,导航控制器在底层视图控制器的内容之上显示一个导航栏。即使这些视图是部分透明的,它们仍然会遮挡其下方的内容。

对于self.view,整个界面的可见部分会排除状态栏、导航栏、标签栏等占据的区域。
对于普通UIView的 ,默认填充为 8px。

所以基本上,如果你想someView被限制在 的安全区域/边距内otherView,那么你将引用otherViewlayoutMarginsGuide锚点。
如果没有,那么只需otherView's 锚就足够了。

1. 示例(带layoutMarginsGuide):

let textField = UILabel()
textField.text = "Using Layout Margins Guide Anchors"
textField.backgroundColor = UIColor.red
textField.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(textField)

var constraints = [NSLayoutConstraint]()
//textfield's top edge = self.view's margin's top edge
constraints.append(textField.topAnchor.constraint(equalTo: self.view.layoutMarginsGuide.topAnchor))

//textfield's leading edge = self.view's margin's leading edge
constraints.append(textField.leadingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.leadingAnchor))

//textfield's trailing edge = self.view's margin's trailing edge
constraints.append(textField.trailingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.trailingAnchor))

//Apply the constraints
NSLayoutConstraint.activate(constraints)

输出:

关于 layoutMarginsGuide

观察:

  • self.view从的左/右边缘离开 20px
  • 在状态栏下方立即开始
    • 如果您有一个导航栏,那么它将在该导航栏下方开始
  • 这些是self.view安全区域/布局边距

2. 示例(不带layoutMarginsGuide):

let textField = UILabel()
textField.text = "Without Layout Margins Guide Anchors"
textField.backgroundColor = UIColor.red
textField.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(textField)

var constraints = [NSLayoutConstraint]()
//textfield's top edge = self.view's top edge
constraints.append(textField.topAnchor.constraint(equalTo: self.view.topAnchor))

//textfield's leading edge = self.view's leading edge
constraints.append(textField.leadingAnchor.constraint(equalTo: self.view.leadingAnchor))

//textfield's trailing edge = self.view's trailing edge
constraints.append(textField.trailingAnchor.constraint(equalTo: self.view.trailingAnchor))

//Apply the constraints
NSLayoutConstraint.activate(constraints)

输出: 单独查看锚点

观察:

  • 立即从self.view的左/右边缘开始
  • 立即从self.view与状态栏重叠的顶部边缘 开始
    • 如果有导航栏,它也会重叠
  • 这些是self.view界限

最后,这取决于您的要求。
有时你应该使用它,有时你可以使用它,有时你只是不需要使用它。

PS:现在,无论是基于UIView的锚点还是layoutMarginsGuide锚点,它都会自动响应设备旋转或任何其他布局变化。

于 2018-06-03T15:24:50.437 回答