删除 NSLayoutConstraint 的正确方法

Correct way to delete a NSLayoutConstraint

在我的应用程序中,我经常使用约束,在大多数情况下还使用动画。在某些情况下,我需要删除约束并添加新约束。

因为我也需要支持 iOS 7,所以我无法使用 active 属性,否则这将是我的解决方案。

移除约束的方法是在UIView上使用removeConstraint方法。

是否可以创建类似

的方法
constraint.remove()

所以您不必知道哪个视图负责约束?

不,据我所知没有。主机视图的自动管理仅在 iOS8.

中出现

丑陋的实现可能遍历所有视图的所有约束以找到它所在的视图。

但通常情况下,以一种您始终知道它们是在哪个视图上定义的方式来管理约束应该不难。

我所做的是创建我希望能够 add/remove 的约束数组,并简单地使用以下内容:

@property NSMutableArray *newConstraints;

填写newConstraints

iOS7 和 iOS8:

[self.viewToChange addConstraints:self.newConstraints];
[self.viewToChange removeConstraints:self.newConstraints];

或iOS8,使用新机制

[NSLayoutConstraint activateConstraints:self.newConstraints];
[NSLayoutConstraint deactivateConstraints:self.newConstraints];

有了它,您可以应用一个集合,删除该集合并应用一个新集合。

如果您可以识别哪些约束是哪些,您也可以从故事板集中创建初始列表。

我最终使用了 PureLayout 库提供的方法 autoRemovehttps://github.com/smileyborg/PureLayout

此方法使用 firstItem 或 secondItem 找到 commonSuperview 并从正确的视图中删除约束。

它导致了这个班轮:

containerTopConstraint.autoRemove()