layoutMarginsGuide似乎有点过分吗?

时间:2018-05-07 12:29:11

标签: ios swift nslayoutconstraint nslayoutanchor

当我尝试创建布局约束时,我阅读了有关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确实为布局边距属性提供了锚属性?如果有人知道任何事我会非常感激。

1 个答案:

答案 0 :(得分:4)

这取决于您的设计要求。

layoutMarginsGuide documentation states

  

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

布局边距基本上只是视图的safe area

  

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

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

所以基本上,如果您希望someView被约束在otherView的安全区/边距内,那么您将引用otherView的{​​{1}}个锚点。 /> 如果没有,那么仅layoutMarginsGuide的锚就足够了。

1。示例(带otherView):

layoutMarginsGuide

输出:

On 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) 的左/右边缘留下20px
  • 立即开始状态栏下方
    • 如果您有导航栏,那么它将从
    • 下方开始
  • 这些是self.view的安全区/布局边距

2。示例(没有self.view):

layoutMarginsGuide

输出: On View Anchors alone

观察:

  • 立即从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的界限

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

PS:现在,无论您是基于self.view的锚点还是UIView锚点,它都会响应设备轮换或任何其他布局自动更改。