如何检查视图中是不是已经存在约束?

Posted

技术标签:

【中文标题】如何检查视图中是不是已经存在约束?【英文标题】:How to check if a constraint already exists inside a view?如何检查视图中是否已经存在约束? 【发布时间】:2015-04-09 08:49:25 【问题描述】:

我正在为我的 tableView 和其中的每个单元格使用自动布局,我以编程方式创建了一些约束。

为了避免每次都删除所有的约束,想知道有没有办法循环view.constraints(),如果有H:|-view-|这样的约束,我就删除了。

有可能吗?

【问题讨论】:

您能详细说明一下吗?你想达到什么目的?我确信有一些更好的解决方案可以解决您的问题,而无需检查约束是否存在。 自动调整大小蒙版实际上添加了一些约束,但我确实找到了另一种方法。 @Nico 您可以为每个约束赋予标识符,这样您就可以在需要时获得特定的约束。 developer.apple.com/documentation/uikit/nslayoutconstraint/… 【参考方案1】:

您需要使用变量(或数组)来保存与您想要的匹配的那些约束,然后循环 view.constraints() 以删除它们。当您使用视觉格式时,您创建的任何内容都会转换为多个约束。

另一种使用方法是遍历约束并检查约束属性,例如firstItem和secondItem,relation等,以匹配您想要的。

【讨论】:

【参考方案2】:

这是我检查控件是否已经具有宽度或高度约束的方法(Swift 5.1):

debugPrint(btn.constraints.contains(where:  (item) -> Bool in
    return item.firstAttribute.rawValue == NSLayoutConstraint.Attribute.width.rawValue;
    ))
debugPrint(btn.constraints.contains(where:  (item) -> Bool in
    return item.firstAttribute.rawValue == NSLayoutConstraint.Attribute.height.rawValue;
    ))

【讨论】:

【参考方案3】:

无需循环约束。这应该有效:

toRemove = NSLayoutConstraint.constraints(withVisualFormat: "H:|-view-|",
                                                       options: [],
                                                       metrics: nil,
                                                         views: ["view": yourView])
viewWithConstraints.removeConstraints(toRemove)

【讨论】:

以上是关于如何检查视图中是不是已经存在约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查子视图控制器是不是存在

如何检查 ViewComponent 视图是不是存在?

如何检查视图是不是存在,如果不存在则创建

Sencha Touch 2 - 如何检查 ViewPort 中是不是存在项目

如何检查视图控制器是不是添加到堆栈中

在添加另一个视图之前检查是不是存在来自 layoutinflater 的视图