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



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

     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 确实为布局边距属性提供了 anchor 属性?请如果有人知道任何事情,我将不胜感激。

最佳答案

这取决于您的设计要求。

layoutMarginsGuide documentation states :



其中 Layout Margins 基本上只是 View 的 safe area :



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

所以基本上,如果您希望 someView 被限制在 otherView 的安全区域/边距内,那么您将引用 otherViewlayoutMarginsGuide anchor 。
如果没有,那么只需 otherView 的 anchor 就足够了。

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)

输出:

ios - layoutMarginsGuide 似乎有点过分?-LMLPHP

观察:
  • 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)
    

    输出:
    ios - layoutMarginsGuide 似乎有点过分?-LMLPHP

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


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

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

    关于ios - layoutMarginsGuide 似乎有点过分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50214263/

    10-10 08:18