← Назад к вопросам
Какой протокол использовал для создания кастомных анимаций?
1.0 Junior🔥 161 комментариев
#Анимации и графика
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Протоколы для создания кастомных анимаций в iOS
В iOS-разработке существует несколько ключевых подходов и протоколов для создания кастомных анимаций, выбор которых зависит от конкретной задачи, требуемой производительности и сложности анимации.
Основные протоколы и API:
- UIViewAnimating (в составе UIViewPropertyAnimator)
- UIViewPropertyAnimator (представлен в iOS 10+) – это современный, гибкий и интерактивный способ анимирования свойств UIView. Он реализует протокол
UIViewAnimating, что позволяет:
- UIViewPropertyAnimator (представлен в iOS 10+) – это современный, гибкий и интерактивный способ анимирования свойств UIView. Он реализует протокол
- Приостанавливать, возобновлять и отменять анимации.
- Изменять направление (реверс).
- Настраивать кривые анимации (линейные, 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()
-
UIViewImplicitlyAnimating
- Это подпротокол
UIViewAnimating, который добавляет возможность изменять анимацию после её начала (dynamic animations). Используется при создании интерактивных или прерываемых анимаций.
- Это подпротокол
-
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")
- 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).