В каком методе жизненного цикла UIViewController следует запускать анимации интерфейса?

«В каком методе жизненного цикла UIViewController следует запускать анимации интерфейса?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оптимальный метод для запуска большинства анимаций – viewDidAppear(_:).

Почему не viewDidLoad или viewWillAppear? На этих этапах view может быть добавлена в иерархию, но ее layout (размеры и положение) еще не окончательный. Анимация, зависящая от frame или bounds, может работать некорректно.

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

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // Простая анимация появления
    UIView.animate(withDuration: 0.5, delay: 0.1, options: .curveEaseOut) {
        self.welcomeLabel.alpha = 1.0
        self.welcomeLabel.transform = .identity
    }

    // Запуск циклической анимации (например, индикатор загрузки)
    startLoadingAnimation()
}

Дополнительные рекомендации:

  1. Для гарантии можно обернуть вызов в DispatchQueue.main.async:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.async {
            // Анимация гарантированно запустится после полного отображения
            self.animateIntroSequence()
        }
    }
  2. Анимации, не зависящие от layout, можно запускать в viewWillAppear (например, изменение alpha с 0 на 1).

  3. Используйте viewWillLayoutSubviews или viewDidLayoutSubviews для анимаций, которые должны реагировать на изменение размеров (например, при повороте устройства).

  4. Останавливайте анимации в viewWillDisappear или viewDidDisappear, чтобы избежать утечек ресурсов и работы в фоне.

Итог: viewDidAppear обеспечивает корректные размеры view и плавный пользовательский опыт.