Swift NSLayoutConstraint将UIView集中在兄弟姐妹的中心位置

时间:2014-12-16 03:57:55

标签: swift nslayoutconstraint

我收到了错误:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'*** + [NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]:布局属性的配对无效

有什么想法吗?

这是我的代码:

static func addViewConstraintsCenterTop(constrainObject : UIView, toSibling : UIView) {

    constrainObject.setTranslatesAutoresizingMaskIntoConstraints(false)

    var constraints:[NSLayoutConstraint] = []

    var constW = NSLayoutConstraint(item: constrainObject, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: toSibling, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0)
    constraints.append(constW)

    var constH = NSLayoutConstraint(item: constrainObject, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: toSibling, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)
    constraints.append(constH)

    constrainObject.addConstraints(constraints)
}

2 个答案:

答案 0 :(得分:3)

兄弟视图之间的约束不能安装在任何兄弟上,但必须安装在共同的祖先上。

来自Apple Auto Layout Guide安装约束部分:

  

保存约束的视图必须是视图的祖先   约束涉及,通常应该是最接近的共同点   祖先。 (这是现有的NSView API意义上的祖先,   视图是其自身的祖先。)约束在坐标系中解释   那种观点。

如果你想保留这个约束,你需要保持对它的引用,并在你的视图的超级视图发生变化时手动将它添加到正确的超级视图中,理想情况是在你的视图控制器中updateViewConstraints()方法。

答案 1 :(得分:0)

我怀疑您必须将约束添加到超级视图,即包含constrainObjecttoSibling的视图。