Какие основные API используются для создания анимаций в UIKit?

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

Ответ

Анимации в UIKit работают путем плавного изменения анимируемых свойств UIView или ее слоя CALayer с течением времени. Основные API:

1. UIView.animate (Классический API) Простой метод для анимации нескольких свойств одновременно.

UIView.animate(withDuration: 0.3,
               delay: 0.0,
               options: [.curveEaseInOut]) {
    // Изменяемые свойства
    view.alpha = 0.0
    view.frame.origin.y += 50
    view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
} completion: { finished in
    // Действие по завершении
    view.removeFromSuperview()
}

2. UIViewPropertyAnimator (iOS 10+, Гибкий и контролируемый) Позволяет интерактивно управлять анимацией (пауза, отмена, изменение скорости).

let animator = UIViewPropertyAnimator(duration: 0.5,
                                      dampingRatio: 0.7) {
    view.frame.origin.x = 200
}
// Добавление этапов анимации
animator.addAnimations { view.alpha = 0.5 }
// Запуск
animator.startAnimation()
// Возможность паузы и отмены: animator.pauseAnimation(), animator.stopAnimation(true)

3. Core Animation (CALayer, для сложных и производительных анимаций) Прямая работа с графическим слоем. Позволяет анимировать свойства, недоступные для UIView.

let animation = CABasicAnimation(keyPath: "transform.rotation.z")
animation.fromValue = 0
animation.toValue = CGFloat.pi * 2
animation.duration = 1.0
animation.repeatCount = .infinity
view.layer.add(animation, forKey: "spinAnimation")

Ключевые принципы:

  • Анимируемые свойства: frame, bounds, center, alpha, transform, backgroundColor.
  • Производительность: Анимации выполняются в отдельном потоке рендеринга и используют аппаратное ускорение.
  • Избегайте анимации frame вместе с Auto Layout. Вместо этого анимируйте константы constraints или используйте transform.
  • Для сложных последовательностей и переходов между контроллерами используйте UIViewControllerTransitioningDelegate.