获取NSLayoutConstraint标识符不适用于topAnchor

时间:2019-07-19 17:30:07

标签: swift nslayoutconstraint

我想在运行时更改某些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
    } 

它不会进入障碍

1 个答案:

答案 0 :(得分:1)

问题是您在错误的视图上调用getConstraint。当您激活myStackView和其他视图之间的约束时:

self.myStackView.topAnchor.constraint(
    equalTo: someView.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor") 

...该约束属于myStackViewsomeView的公共 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上调用方法,也可以使用。