Как используется layoutIfNeeded? - PullRequest
49 голосов
/ 26 июля 2009

Когда и как используется layoutIfNeeded? Я знаю, что когда мы меняем компоновку представления, мы можем вызвать setNeedsLayout, чтобы обновить макет, но не уверен, когда следует использовать layoutIfNeeded.

ПРИМЕЧАНИЕ. В реальном коде используется layoutIfNeededно забыл, в каком контексте он использовался.

Ответы [ 4 ]

66 голосов
/ 24 сентября 2010

layoutIfNeeded вынуждает получателя немедленно размещать свои подпредставления, если это необходимо.

Предположим, вы переопределили layoutSubviews, и UIKit считает, что вашему представлению требуется макет по какой-либо причине (например, вы позвонили setNeedsLayout, когдаобработка некоторых действий пользователя). Затем ваш пользовательский метод layoutSubviews будет вызываться немедленно, а не тогда, когда он обычно вызывается в обычной последовательности событий цикла выполнения UIKit (после обработки события, но до drawRect:).

Пример того, почемувам может потребоваться вызвать layoutIfNeeded в пределах одного цикла выполнения:

  1. Вы изменяете размер настраиваемого представления, содержащего табличное представление, с настраиваемым макетом. setNeedsLayout установлен так, что layoutSubviews будет вызван позже.
  2. Объект контроллера запрашивает представление таблицы, чтобы прокрутить до определенной ячейки при обработке пользовательского события.
  3. Ваше пользовательское представление выполняетнекоторый пользовательский размер табличного представления в layoutSubviews, который изменяет размер табличного представления.

Проблема в том, что когда контроллер запросил табличное представление для прокрутки (шаг 2), у табличного представления были границы, которыебыли несвежими. Обновленные границы будут установлены только в табличном представлении позже (шаг 3). То, к чему контроллер хотел прокрутить табличное представление, может фактически не быть видимым после выполнения layoutSubviews. Тогда решение будет для контроллера вызывать layoutIfNeeded в ситуациях, когда он знает, что это может произойти.

0 голосов
/ 01 марта 2019

LayoutSubViews () - не вызывать напрямую, вместо этого вызывать setNeedsLayout (), переопределять, если база ограничений не обеспечивает ожидаемого поведения.

SetNeedsLayout () - вызывать основной поток, он ожидает следующегоцикл рисования. хорошо для производительности.

LayoutIfNeeded () - Компоновка подпредставлений немедленно.

0 голосов
/ 15 февраля 2019

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

Метод setNeedsLayout для UIView сообщает системе, что вы хотите, чтобы она разметила и перерисовала это представление и все его подпредставления. , когда пришло время для цикла обновления. Это асинхронное действие, потому что метод завершается и возвращается немедленно, но только в течение некоторого более позднего времени происходит разметка и перерисовка, и вы не знаете, когда будет этот цикл обновления.

В отличие от этого, метод layoutIfNeeded - это синхронный вызов, который сообщает системе, что вам нужен макет и перерисовка представления и его подпредставлений, и вы хотите, чтобы это было сделано немедленно, без ожидания цикла обновления. Когда вызов этого метода завершен, компоновка уже была скорректирована и прорисована на основе всех изменений, которые были отмечены до вызова метода.

Итак, кратко заявлено, layoutIfNeeded говорит об обновлении немедленно, тогда как setNeedsLayoutговорит, пожалуйста, обновите, но вы можете подождать до следующего цикла обновления.

0 голосов
/ 26 июля 2009

setNeedsLayout на самом деле вызывает layoutIfNeeded, поэтому если ваш вызов setNeedsDisplay, то нет причин вызывать layoutIfNeeded. Таким образом, setNeedsLayout - это удобный метод для вызова layoutIfNeeded, который выполняет тяжелую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...