Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про IOS: layout, pass, viewwilllayoutsubviews, viewdidlayoutsubviews

В чем разница между viewWillLayoutSubviews и viewDidLayoutSubviews?

Вопрос проверяет понимание layout-процесса в UIKit и умение выбирать правильный момент для изменения геометрии UI.

Короткий ответ

Оба метода вызываются во время layout-прохода, но в разные моменты. viewWillLayoutSubviews вызывается до того, как система рассчитает и применит фреймы сабвью, а viewDidLayoutSubviews — после завершения расчётов. В первом методе удобно менять констрейнты или подготавливать состояние, во втором — работать с уже финальными размерами. Неправильный выбор метода часто приводит к бесконечным layout-циклам.

Длинный ответ

Layout в UIKit — это отдельный процесс, который система запускает всякий раз, когда считает, что геометрия интерфейса могла измениться. Эти два метода — точки входа до и после применения layout.

Общая идея layout-прохода

Перед тем как отрисовать экран, UIKit:

  • пересчитывает размеры и позиции view

  • применяет Auto Layout или frame-based layout

  • уведомляет контроллер о ходе процесса

viewWillLayoutSubviews и viewDidLayoutSubviews вызываются каждый раз, когда происходит layout, а не только при первом показе.

viewWillLayoutSubviews

Этот метод вызывается перед тем, как система обновит frame и bounds сабвью.

Типичные задачи:

  • обновление констрейнтов

  • включение или выключение элементов UI

  • подготовка данных для layout

Важно:

  • размеры ещё не финальные

  • изменение frame внутри метода может быть перезаписано системой

viewDidLayoutSubviews

Этот метод вызывается после того, как layout завершён.

Типичные задачи:

  • работа с реальными размерами (frame, bounds)

  • вычисление размеров для кастомной отрисовки

  • обновление масок, градиентов, cornerRadius

Пример безопасного использования:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    avatarView.layer.cornerRadius = avatarView.bounds.width / 2
}

Частая ошибка

Если внутри viewDidLayoutSubviews:

  • менять констрейнты

  • вызывать setNeedsLayout()

можно получить:

  • бесконечный layout-цикл

  • деградацию производительности

Краткий вывод

viewWillLayoutSubviews — подготовка к layout,
viewDidLayoutSubviews — работа с результатом layout.
Чёткое разделение обязанностей избавляет от багов и лишних перерасчётов.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • IOS

    IOS

Ключевые слова

#layout

#pass

#viewwilllayoutsubviews

#viewdidlayoutsubviews

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.