← Назад к вопросам

Какой протокол использовал для создания кастомных анимаций?

1.0 Junior🔥 161 комментариев
#Анимации и графика

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Протоколы для создания кастомных анимаций в iOS

В iOS-разработке существует несколько ключевых подходов и протоколов для создания кастомных анимаций, выбор которых зависит от конкретной задачи, требуемой производительности и сложности анимации.

Основные протоколы и API:

  1. UIViewAnimating (в составе UIViewPropertyAnimator)
    • UIViewPropertyAnimator (представлен в iOS 10+) – это современный, гибкий и интерактивный способ анимирования свойств UIView. Он реализует протокол UIViewAnimating, что позволяет:
     - Приостанавливать, возобновлять и отменять анимации.
     - Изменять направление (реверс).
     - Настраивать кривые анимации (линейные, ease-in, spring-эффекты).
     - Добавлять completion-блоки.
  • Пример:
let animator = UIViewPropertyAnimator(duration: 0.5, curve: .easeInOut) {
    view.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
    view.alpha = 0.8
}
animator.addCompletion { _ in
    print("Анимация завершена")
}
animator.startAnimation()
  1. UIViewImplicitlyAnimating

    • Это подпротокол UIViewAnimating, который добавляет возможность изменять анимацию после её начала (dynamic animations). Используется при создании интерактивных или прерываемых анимаций.
  2. CAAnimation и его подклассы (Core Animation)

    • Для сложных, производительных анимаций, затрагивающих слои (CALayer), используется фреймворк Core Animation. Ключевые протоколы и классы:
     - **CAAction** – протокол для объектов, реагирующих на изменения слоя (например, при изменении `opacity`).
     - **CAAnimationDelegate** – делегат для обработки событий начала и завершения анимации.
     - Подклассы: `CABasicAnimation`, `CAKeyframeAnimation`, `CASpringAnimation`, `CATransition`.
  • Пример анимации с помощью CABasicAnimation:
let animation = CABasicAnimation(keyPath: "transform.scale")
animation.fromValue = 1.0
animation.toValue = 2.0
animation.duration = 0.3
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
view.layer.add(animation, forKey: "scaleAnimation")
  1. UIViewControllerAnimatedTransitioning
    • Для кастомных переходов между контроллерами (например, в UINavigationController или при модальном презенте) используется этот протокол. Он позволяет задать:
     - Длительность анимации (`transitionDuration`).
     - Логику анимации (`animateTransition`).
  • Пример интеграции:
class CustomTransition: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5
    }
    
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let toView = transitionContext.view(forKey: .to) else { return }
        let container = transitionContext.containerView
        toView.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
        container.addSubview(toView)
        
        UIView.animate(withDuration: 0.5, animations: {
            toView.transform = .identity
        }) { _ in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}

Когда что использовать:

  • UIView.animate/UIViewPropertyAnimator – для простых анимаций свойств UIView (frame, alpha, transform). Поддерживает spring-анимации через параметры dampingRatio и initialSpringVelocity.
  • Core Animation – для анимаций на уровне слоёв, когда нужна максимальная производительность (например, анимация тени, градиентов) или сложные Keyframe-анимации.
  • UIViewControllerAnimatedTransitioning – исключительно для переходов между контроллерами.

Современные тренды:

  • С iOS 15+ для анимации доступен SwiftUI, где анимации объявляются декларативно через модификаторы (.animation(), withAnimation). В гибридных проектах можно сочетать UIKit и SwiftUI через UIHostingController.
  • Для интерактивных анимаций (например, drag-and-drop) часто используется UIDynamicAnimator (физика-подобные анимации).

Выбор протокола зависит от контекста: UIViewPropertyAnimator подходит для большинства повседневных задач благодаря простоте и интерактивности, Core Animation – для низкоуровневых оптимизаций, а UIViewControllerAnimatedTransitioning – для навигационных переходов. Важно учитывать, что анимации должны выполняться на main thread, но рендеринг Core Animation оптимизирован под GPU, что обеспечивает высокую частоту кадров (60 FPS).