视图的底部和右侧约束是否为负?

Jac*_*ing 0 uiview ios nslayoutconstraint swift

这是一种将子视图固定到UIView实例的方法。请原谅凌乱的代码,我一直在尝试让它工作。

open static func withEmbeddedView(_ view: UIView, andFixedHeight height: CGFloat) -> PMGAlertControllerEmbedComponent {
    let base = PMGAlertControllerEmbedComponent(frame: CGRect.zero)
    base.addSubview(view)
    view.translatesAutoresizingMaskIntoConstraints = false
    base.translatesAutoresizingMaskIntoConstraints = false

    let left = NSLayoutConstraint(item: view, attribute: .left, relatedBy: .equal, toItem: base, attribute: .left, multiplier: 1, constant: 0)
    let right = NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: base, attribute: .right, multiplier: 1, constant: 0)
    let top = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: base, attribute: .top, multiplier: 1, constant: 0)
    let bottom = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: base, attribute: .bottom, multiplier: 1, constant: 0)
    base.addConstraints([left, right, top, bottom])
    view.addConstraint(NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: height))
    base.leftConstraint = left
    base.rightConstraint = right
    base.topConstraint = top
    base.bottomConstraint = bottom
    base.layoutIfNeeded()
    return base
}
Run Code Online (Sandbox Code Playgroud)

现在这本身就可以正常工作,但是一旦我尝试在其他地方修改这些约束的常量,比如将它们设置为 16 以添加一点填充,右侧和底部约束就会相反!因此,而不是子视图比父视图小 16pts,而是大 16pts?顶部和左侧的行为符合预期。

请注意,如果我将顶部和左侧设置为 16,但将底部和右侧设置为 -16,这会产生所需的结果,但我不应该这样做吗?我哪里错了?

非常感谢。

Elv*_*vin 6

约束中项目的顺序很重要。

改变

let bottom = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: base, attribute: .bottom, multiplier: 1, constant: 0)
let right = NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: base, attribute: .right, multiplier: 1, constant: 0)
Run Code Online (Sandbox Code Playgroud)

let bottom = NSLayoutConstraint(item: base, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
let right = NSLayoutConstraint(item: base, attribute: .right, relatedBy: .equal, toItem: view, attribute: .right, multiplier: 1, constant: 0)
Run Code Online (Sandbox Code Playgroud)

试着这样想:把第二项当作原点。如果值为正,则第一项在第二项的右侧/底部方向。如果该值为负,则表示方向是向左和从上到第二项。

既然你想把view里面的base,和你想在约束正值,你需要使用base的第一个项目,并view作为约束第二项(起源)。所以这意味着当约束的常数为正时base向右/底部view