我想在运行时更改某些View的TopAnchor约束。
约束创建:
self.buttonHStack.topAnchor.constraint(equalTo: cellHStack.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
extension UIView {
func getConstraint(withIndentifier indentifier: String) -> NSLayoutConstraint? {
return self.constraints.filter { $0.identifier == indentifier }.first
}
}
extension NSLayoutConstraint {
func activate(withIdentifier identifier: String) {
self.identifier = identifier
self.isActive = true
}
}
self.myStackView.topAnchor.constraint(equalTo: someView.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
但是当我尝试获取其参考文献时:
if let filteredConstraint = self.myStackView.getConstraint(withIndentifier: "topAnchor") {
//Edit here
}
它不会进入障碍
答案 0 :(得分:1)
问题是您在错误的视图上调用getConstraint
。当您激活myStackView
和其他视图之间的约束时:
self.myStackView.topAnchor.constraint(
equalTo: someView.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
...该约束属于myStackView
和someView
的公共 superview 。所以当你说
self.myStackView.getConstraint(withIndentifier: "topAnchor")
...不存在。您在错误的角度查看约束。
但是您的getConstraint
方法(显然来自here)是个好主意,所以让我们更正确(更优雅)地重写它,以便我们在视图层次结构中查找约束:
extension UIView {
func constraint(withIdentifier id: String) -> NSLayoutConstraint? {
return self.constraints.first { $0.identifier == id } ??
self.superview?.constraint(withIdentifier: id)
}
}
现在(更改名称)(即使更改名称),即使您在myStackView
上调用方法,也可以使用。