Nin*_*nja 1 ios nslayoutconstraint swift 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
Run Code Online (Sandbox Code Playgroud)
那么,为什么我们需要UILayoutGuide对象?事实证明,UIView是否为布局边距属性提供锚属性?请如果有人知道我会非常感激。
这取决于您的设计要求。
表示视图边距的布局指南。使用此布局指南的锚点来创建具有视图边距的约束。
布局边距基本上只是视图的安全区域:
安全区域可帮助您将视图放置在整个界面的可见部分内。UIKit定义的视图控制器可以在内容顶部放置特殊视图。例如,导航控制器在基础视图控制器内容的顶部显示导航栏。即使这些视图是部分透明的,它们仍会遮挡其下面的内容。
对于self.view,整个界面的可见部分将排除状态栏,导航栏,标签栏等占用的区域。
对于normal而言UIView,默认填充为8px。
因此,基本上,如果您希望someView限制在的安全区域/边界内otherView,则可以引用otherView的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)
Run Code Online (Sandbox Code Playgroud)
输出:
观察:
self.view的左/右边缘离开20pxself.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)
Run Code Online (Sandbox Code Playgroud)
观察:
self.view的左/右边缘立即开始self.view与状态栏重叠的顶部边缘
立即开始self.view界限最后,这取决于您的要求。
有时您应该使用它,有时您可以使用它,有时您只是不需要使用它。
PS:现在,无论您是基于UIView锚还是layoutMarginsGuide锚,它都会自动响应设备旋转或任何其他布局更改。