it-swarm.com.ru

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

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

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

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

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

constraint.remove()

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

15
Antoine

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

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

Это привело к этому одному вкладышу:

containerTopConstraint.autoRemove()
6
Antoine

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

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

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

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

15
Rory McKinnel

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

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

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

0
dasdom