获取 NSLayoutConstraint 标识符不适用于 topAnchor

Posted

技术标签:

【中文标题】获取 NSLayoutConstraint 标识符不适用于 topAnchor【英文标题】:Get NSLayoutConstraint Identifier is not working for topAnchor 【发布时间】:2019-07-19 17:30:07 【问题描述】:

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

它不会进入区块

【问题讨论】:

两个视图之间的约束,被添加到两个视图的父级你需要self.myStackView.superView?.getConstraint(withIndentifier: "topAnchor") 【参考方案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 上调用它,您的方法调用也将起作用。

【讨论】:

以上是关于获取 NSLayoutConstraint 标识符不适用于 topAnchor的主要内容,如果未能解决你的问题,请参考以下文章

无法获取 NSLayoutConstraint 的约束

如何修改NSLayoutConstraint的multiplier

iOS NSLayoutConstraint 设置 multiplier ,多次更新无效问题

NSLayoutConstraint 激活/停用

NSLayoutConstraint 问题

如何检查 NSLayoutConstraint 是不是动画