如何理解NSLayoutConstraint中trailing锚点的约束写法?
理解NSLayoutConstraints中trailing锚点的系统间距写法
这个困惑的核心是搞懂equalToSystemSpacingAfter(_:multiplier:)方法的调用逻辑——谁调用这个方法,谁就会被放在参数锚点的「布局方向后方」,两者间距为系统默认间距的指定倍数。
先明确iOS默认的LTR(左到右)布局方向:
leading= 左侧trailing= 右侧after= 沿布局方向向右
逐行拆解你的约束:
垂直居中约束:
loginView.centerYAnchor.constraint(equalTo: view.centerYAnchor)没什么好说的,loginView在父view垂直方向居中。
左侧系统间距约束:
loginView.leadingAnchor.constraint(equalToSystemSpacingAfter: view.leadingAnchor, multiplier: 1)调用者是
loginView.leadingAnchor,参数是view.leadingAnchor——意思是loginView的左边缘,在父view左边缘的右侧(after方向),间距为1倍系统默认值,刚好实现左侧留空白的需求。右侧系统间距约束(你困惑的这行):
view.trailingAnchor.constraint(equalToSystemSpacingAfter: loginView.trailingAnchor, multiplier: 1)这里的逻辑是:我们需要loginView的右边缘到父view的右边缘之间留1倍系统间距,按照
equalToSystemSpacingAfter的规则,必须让「父view的右边缘」(也就是最终要在后方的那个锚点)来调用方法,参数传「loginView的右边缘」(前方的锚点)。这样就实现了父view右边缘在loginView右边缘的右侧,间距1倍系统值,刚好符合我们要的右侧留白效果。
为什么不能反过来写?
如果错误地用loginView.trailingAnchor调用:
// 错误写法,会把loginView推到屏幕外 loginView.trailingAnchor.constraint(equalToSystemSpacingAfter: view.trailingAnchor, multiplier: 1)
这会让loginView的右边缘跑到父view右边缘的右侧,直接超出屏幕范围,完全不符合需求。
等价的普通约束写法(帮助理解)
这行系统间距约束等价于用固定常量的传统写法(但系统间距方法会自动适配不同设备/系统的默认间距,更推荐):
loginView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -UIView.systemSpacing)
内容的提问来源于stack exchange,提问作者Jackson Renson
相关产品推荐
相关产品推荐

