Я знаю, что цепь автоматического макета состоит в основном из трех разных процессов.
- ограничения обновления
- макеты (здесь мы получаем расчет кадров)
- дисплей
То, что не совсем ясно для меня, - это внутреннее различие между -setNeedsLayout
и -setNeedsUpdateConstraints
. От Apple Docs:
Вызовите этот метод в основной теме приложений, если хотите отрегулируйте расположение представлений представлений. Этот метод отмечает запрос и возвращается немедленно. Поскольку этот метод не принудительное немедленное обновление, но вместо этого ожидает следующего обновления цикла, вы можете использовать его для отмены макета нескольких видов до того, как какое-либо из этих представлений будет обновлено. Это позволяет объедините все обновления макета в один цикл обновления, который обычно лучше для производительности.
Когда свойство вашего пользовательского представления изменяется таким образом, чтобы это повлияло ограничений, вы можете вызвать этот метод, чтобы указать, что ограничения должны быть обновлены в какой-то момент в будущем. Затем система будет вызовите updateConstraints как часть обычного прохода макета. обновление ограничения сразу же, как только они понадобятся, гарантирует, что вы не нужно излишне пересчитывать ограничения, когда несколько изменений сделанный на ваш взгляд между проходами макета.
Когда я хочу анимировать представление после изменения ограничения и оживить изменения, которые я обычно вызываю, например:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
Я выяснил, что если я использую -setNeedsLayout
вместо -setNeedsUpdateConstraints
, все работает так, как ожидалось, но если я изменил -layoutIfNeeded
на -updateConstraintsIfNeeded
, анимации не произойдет.
Я попытался сделать свой вывод:
-
-updateConstraintsIfNeeded
только ограничения обновления, но не заставляют макет входить в процесс, поэтому исходные кадры сохраняются. -
-setNeedsLayout
вызывает также метод-updateContraints
Итак, когда нормально использовать один вместо другого? и о методах компоновки, мне нужно вызвать их в представлении, которое имеет изменение ограничения или родительского представления?