Правильный способ удаления 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.
Уродливая реализация может зацикливаться на всех ограничениях всех представлений, чтобы найти представление, в котором оно находится.
Но обычно не должно быть трудно управлять ограничениями таким образом, чтобы вы всегда знали, на каком виде они определены.