当我尝试创建布局约束时,我阅读了有关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确实为布局边距属性提供了锚属性?如果有人知道任何事我会非常感激。
答案 0 :(得分:4)
这取决于您的设计要求。
layoutMarginsGuide
documentation states:
表示视图边距的布局指南。 使用此布局指南的锚点创建具有视图边距的约束。
布局边距基本上只是视图的safe area:
安全区域可帮助您将视图放置在整个界面的可见部分中。 UIKit定义的视图控制器可以在您的内容之上放置特殊视图。例如,导航控制器在底层视图控制器的内容之上显示导航栏。即使这些视图部分透明,它们仍会遮挡其下的内容。
对于self.view
,整个界面的可见部分将排除状态栏,导航栏,标签栏等占用的区域。
对于普通UIView
,默认填充为8px。
所以基本上,如果您希望someView
被约束在otherView
的安全区/边距内,那么您将引用otherView
的{{1}}个锚点。 />
如果没有,那么仅layoutMarginsGuide
的锚就足够了。
otherView
):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
的安全区/布局边距self.view
):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
的界限最后,这取决于您的要求 有时你应该使用它,有时你可以使用它,有时你只是不需要使用它。
PS:现在,无论您是基于self.view
的锚点还是UIView
锚点,它都会响应设备轮换或任何其他布局自动更改。