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】:我怀疑您必须将约束添加到超级视图,即包含 constrainObject
和 toSibling
的视图。
【讨论】:
但是如果你想保留兄弟约束,而超级视图并不重要(你想在其他视图中使用的“组件”)怎么办?以上是关于Swift NSLayoutConstraint 将 UIView 居中到同级的居中顶部的主要内容,如果未能解决你的问题,请参考以下文章
更改 NSLayoutConstraint 时的 SWIFT 动画
NSLayoutConstraint 的 Unsatisfiable Constraint 以编程方式更改 - swift
如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量
如何在 swift 中使用 NSLayoutConstraint 根据屏幕大小更改设计