Какие операции будут аннулировать ограничения?

UIView updateConstraints имеет примечание:

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

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

Ответ 1

В некоторых экспериментах я обнаружил, что просто добавление, удаление или редактирование ограничений не будет автоматически вызвано вызовом setNeedsUpdateConstraints. На самом деле, я не могу найти способ получить setNeedsUpdateConstraints, который автоматически вызывается системой. Вместе с моим наблюдением, что updateConstraints не будет вызываться без setNeedsUpdateConstraints или invalidateIntrinsicContentSize, который вызывается первым, я считаю, что единственным значимым способом аннулирования любых ограничений является вызов setNeedsUpdateConstraints или invalidateIntrinsicContentSize сам. Таким образом, заметка в вопросительном столбце:

Вы не должны вызывать [self setNeedsUpdateConstraints] или [self invalidateIntrinsicContentSize] в updateConstraints.

Ответ 2

Отличный вопрос!

Ричард Уоррен рассказывает об этом в своем учебнике по блогу ПОНИМАНИЕ АВТОЗАПИСИ:

Если мы хотим аннулировать ограничения вида, мы должны удалить старые ограничения, затем вызовите setNeedsUpdateConstraints. Наш обычай updateConstraints или методы updateViewConstraints могут затем предоставить новые ограничения.

Ограничения не должны быть исключены в методе updateConstraints. Это явно указано в Справочник по классу UIView:

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

Вы не можете аннулировать какие-либо ограничения как часть своего ограничения фазы обновления. Вы также можете не ссылаться на макет или фазу рисования как часть обновления ограничений.

Это отличается от эквивалента диспетчера представлений updateViewConstraints. Подобного положения не существует, чтобы не отменить ограничения в этом методе. Конечно, показывает пример кода, который делает именно это,