вы можете использовать layoutIfNeeded и setNeedsLayout автоматически:
layoutIfNeeded принудительно заставляет получателя немедленно размещать свои подпредставления, если это необходимо.
Предположим, у вас есть переопределенные layoutSubviews, и UIKit чувствует, что вашему представлению требуется макет по какой-либо причине (например, вы вызвали setNeedsLayout при обработке какого-либо действия пользователя). Затем ваш пользовательский метод layoutSubviews будет вызываться немедленно, а не тогда, когда он обычно вызывается в обычной последовательности событий цикла выполнения UIKit (после обработки события, но перед drawRect:).
Пример того, почему вам может потребоваться вызвать layoutIfNeeded в одном цикле выполнения:
Вы изменяете размеры настраиваемого представления, содержащего табличное представление. setNeedsLayout установлен так, что layoutSubviews будет вызываться позже.
Контроллер объекта просит табличное представление прокрутить до некоторой конкретной ячейки при обработке пользовательского события.
Ваше пользовательское представление выполняет некоторое пользовательское изменение размера табличного представления в layoutSubviews, которое изменяет размер табличного представления.
Проблема заключается в том, что когда контроллер запросил прокрутку табличного представления (шаг 2), у табличного представления были устаревшие границы. Обновленные границы будут установлены только в табличном представлении позже (шаг 3). То, к чему контроллер хотел прокрутить табличное представление, может фактически не быть видимым после того, как layoutSubviews сделан. Тогда решение будет для контроллера вызывать layoutIfNeeded в ситуациях, когда он знает, что это может произойти.