Я знаю, що ланцюжок автоматичного компонування складається в основному з 3 різних процесів.
- оновлення обмежень
- перегляди макета (тут ми отримуємо розрахунок кадрів)
- показ
Що для мене не зовсім зрозуміло - це внутрішня різниця між -setNeedsLayout
та -setNeedsUpdateConstraints
. З Документів Apple:
Викличте цей метод у головному потоці програми, коли ви хочете налаштувати макет підпідзору подання. Цей метод записує запит і повертається негайно. Оскільки цей метод не примушує негайного оновлення, а замість цього чекає наступного циклу оновлення, ви можете використовувати його, щоб визнати недійсним макет кількох представлень даних до того, як будь-який із цих представлень буде оновлений. Така поведінка дозволяє консолідувати всі оновлення макета в один цикл оновлення, що зазвичай краще для продуктивності.
Коли властивість вашого власного перегляду змінюється таким чином, що впливатиме на обмеження, ви можете зателефонувати за цим методом, щоб вказати, що обмеження потрібно буде оновити в якийсь момент у майбутньому. Потім система викличе 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
метод також викликає
Отже, коли нормально використовувати один замість іншого? а щодо методів компонування, чи потрібно мені викликати їх у поданні, яке має зміну обмеження або на батьківському поданні?