Правильный способ удаления NSLayoutConstraint

В моих приложениях я много работаю с ограничениями, в большинстве случаев с анимацией. В некоторых случаях мне нужно удалить ограничения и добавить новые.

Поскольку мне также нужно поддерживать iOS 7, я не могу использовать свойство active, которое также было бы для меня решением.

Способом удаления ограничений является использование метода removeConstraint на UIView.

Можно ли создать такой метод, как

constraint.remove()

поэтому вам не нужно знать, какое представление заботится об ограничении?

Ответы

Ответ 1

Я закончил использование метода autoRemove, предоставленного библиотекой PureLayout: https://github.com/smileyborg/PureLayout

Этот метод находит commonSuperview с использованием firstItem или secondItem и удаляет ограничение из правильного представления.

В результате появился один лайнер:

containerTopConstraint.autoRemove()

Ответ 2

Я создаю массивы ограничений, которые я хочу добавить/удалить, и просто использую следующее:

@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];

С помощью этого вы можете применить набор, удалить набор и применить новый набор.

Вы также можете создать исходный список из набора раскадровки, если вы можете определить, какие ограничения есть.

Ответ 3

Нет, не то, что я знаю. Автоматическое управление представлением хоста только в iOS8.

Уродливая реализация может зацикливаться на всех ограничениях всех представлений, чтобы найти представление, в котором оно находится.

Но обычно не должно быть трудно управлять ограничениями таким образом, чтобы вы всегда знали, на каком виде они определены.