Swift NSLayoutConstraint 将 UIView 居中到同级的居中顶部

Posted

技术标签:

【中文标题】Swift NSLayoutConstraint 将 UIView 居中到同级的居中顶部【英文标题】:Swift NSLayoutConstraint centering UIView to centered top of sibling 【发布时间】:2014-12-16 03:57:55 【问题描述】:

我收到了错误:

由于未捕获的异常“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)

【问题讨论】:

【参考方案1】:

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

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

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

如果您想保留此约束,则需要保留对它的引用,并在视图的超级视图更改时手动将其添加到正确的超级视图中,最好是在视图控制器的 updateViewConstraints() 方法中。

【讨论】:

谢谢。我需要花更多时间研究文档。当约束深入多层时会变得更加复杂,同时使用 VFL 与没有。【参考方案2】:

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

【讨论】:

但是如果你想保留兄弟约束,而超级视图并不重要(你想在其他视图中使用的“组件”)怎么办?

以上是关于Swift NSLayoutConstraint 将 UIView 居中到同级的居中顶部的主要内容,如果未能解决你的问题,请参考以下文章

更改 NSLayoutConstraint 时的 SWIFT 动画

NSLayoutConstraint 的 Unsatisfiable Constraint 以编程方式更改 - swift

如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量

如何在 swift 中使用 NSLayoutConstraint 根据屏幕大小更改设计

Swift 3 - NSLayoutConstraint CollectionView 附加到另一个视图

Swift:UIButton 不可点击,NSLayoutConstraint heightAnchor 问题