UIView.animate — основний метод анімації властивостей UIView в iOS, реалізований в UIKit через блоки з duration, delay та options. Метод анімує frame, alpha, transform, backgroundColor та інші анімовані властивості. Стаття описує синтаксис, параметри, практичні приклади та внутрішній устрій анімацій UIKit.
Головне
UIView.animate — статичний метод класу UIView, що з'явився в iOS 4 (2010). Він надає декларативний API для анімації анімованих властивостей (animatable properties) UIView: frame, bounds, center, alpha, transform, backgroundColor. Метод приймає блок (замикання) зі змінами властивостей — система автоматично створює CABasicAnimation для кожної зміненої властивості.
Блочний синтаксис замінив старий beginAnimations/commitAnimations (iOS 2-3) і став стандартом анімації в UIKit. Анімації UIView.animate виконуються на головному потоці та не блокують UI. За замовчуванням тривалість анімації становить 0.25 секунди з кривою easeInOut.
За даними Apple WWDC 2023, рекомендований спосіб анімації в нових проектах — SwiftUI з модифікаторами .animation() та .transition(), але UIView.animate залишається основним інструментом для підтримки iOS 16 та нижче, а також для складних кастомних переходів.
UIView.animate надає три ключові параметри: duration (тривалість в секундах), delay (затримка перед початком) та options (набір бітових масок UIView.AnimationOptions). Options включають curve (easeInOut, easeIn, easeOut, linear), repeat (повтор), autoreverse (повернення), allowUserInteraction, beginFromCurrentState та overrideInheritedDuration.
| Параметр | Тип | Опис |
|---|---|---|
| duration | TimeInterval | Тривалість анімації в секундах (тип Double) |
| delay | TimeInterval | Затримка перед стартом анімації |
| options | UIView.AnimationOptions | Бітова маска: curve, repeat, autoreverse, layoutSubviews |
| animations | () -> Void | Блок зі змінами анімованих властивостей |
| completion | (Bool) -> Void | Замикання після завершення анімації |
Параметр options комбінується через масив: [.curveEaseOut, .repeat, .autoreverse]. Анімація з repeat та autoreverse плавно повертає View у вихідний стан і повторюється нескінченно. Для скінченної кількості повторів використовуйте animateKeyframes.
Spring-анімація додає фізичний ефект пружини: об'єкт не просто переходить з точки A в B, а «перелітає» ціль із загасаючими коливаннями. Параметри: usingSpringWithDamping (демпфірування 0-1, де 0 — максимальні коливання) та initialSpringVelocity (початкова швидкість пружини).
Apple рекомендує usingSpringWithDamping в діапазоні 0.4-0.8 для природних UI-анімацій. Значення 0.5 створює помітний відскок без відчуття «гумовості». initialSpringVelocity = 1.0 відповідає швидкості в 1 pt/сек. При 0 анімація стартує зі стану спокою.
// Приклад spring-анімації та keyframe
import UIKit
class AnimatedView: UIView {
func springBounce() {
// Spring-анімація з демпфіруванням
UIView.animate(
withDuration: 0.8,
delay: 0,
usingSpringWithDamping: 0.5,
initialSpringVelocity: 1.0,
options: [.allowUserInteraction],
animations: {
self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
self.alpha = 0.7
},
completion: { _ in
UIView.animate(withDuration: 0.3) {
self.transform = .identity
self.alpha = 1.0
}
}
)
}
func slideIn(from offset: CGFloat) {
self.transform = CGAffineTransform(translationX: offset, y: 0)
self.alpha = 0.0
UIView.animate(
withDuration: 0.6,
delay: 0.1,
options: [.curveEaseOut]
) {
self.transform = .identity
self.alpha = 1.0
}
}
}UIView.animateKeyframes дозволяє розбити анімацію на кілька кроків (keyframes), кожен зі своїм відносним часом та тривалістю. Метод addKeyframe(withRelativeStartTime:relativeDuration:) приймає часові значення від 0 до 1 відносно загальної тривалості анімації.
Keyframe-анімації корисні для багатоетапних ефектів: пульсація кнопки (збільшення → пауза → повернення), послідовна поява елементів, складні деформації з проміжними станами. Кожен keyframe може мати свою криву анімації через options.
// Keyframe-анімація зі складною послідовністю
func complexPulse() {
UIView.animateKeyframes(withDuration: 2.0, delay: 0, options: [.repeat]) {
UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.25) {
self.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
self.alpha = 0.5
}
UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.25) {
self.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
self.alpha = 0.8
}
UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
self.transform = .identity
self.alpha = 1.0
}
}
}
// Анімація з вкладеними замиканнями
func animateCardTransition() {
UIView.animate(withDuration: 0.4, delay: 0, options: [.curveEaseOut]) {
self.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
} completion: { _ in
UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseIn]) {
self.transform = .identity
}
}
}Під капотом UIView.animate делегує анімацію CALayer кожного UIView через Core Animation (CAAnimation). Коли ви змінюєте frame всередині блоку анімацій, система створює CABasicAnimation для властивостей position та bounds відповідного шару. Якщо змінюється alpha — CABasicAnimation для властивості opacity шару.
Core Animation використовує окремий процес render server (backboardd на iOS), який обробляє анімації на частоті 120 Гц (ProMotion). UIView.animate не блокує головний потік — зміни властивостей надсилаються в render server, який інтерполює кадри без участі застосунку.
За даними Apple, анімації через UIView.animate мають накладні витрати ~2-3% CPU на кожен змінений шар при 60 FPS. Для масових анімацій (20+ об'єктів одночасно) рекомендується використовувати CATransaction та ручне керування шарами.
Для налагодження та візуалізації анімацій UIKit використовуйте Xcode Debug View Hierarchy — він показує активні CAAnimations на кожному шарі, їх тривалість, криву та поточний стан. Розуміння внутрішнього устрою Core Animation допомагає уникнути проблем із продуктивністю при складних анімаціях та вибирати оптимальний підхід між UIView.animate та прямим використанням CABasicAnimation.
Для налагодження та візуалізації анімацій UIKit використовуйте Xcode Debug View Hierarchy — він показує активні CAAnimations на кожному шарі, їх тривалість, криву та поточний стан. Розуміння внутрішнього устрою Core Animation допомагає уникнути проблем із продуктивністю при складних анімаціях та вибирати оптимальний підхід між UIView.animate та прямим використанням CABasicAnimation.
Часто задавані питання
Анімовані властивості UIView: frame, bounds, center, alpha, transform (CGAffineTransform), backgroundColor. Також анімуються зміни layoutIfNeeded() при зміні обмежень Auto Layout. Інші властивості не анімуються через UIView.animate — для них використовуйте CALayer або CADisplayLink.
UIView.animate виконує одну анімацію від поточного стану до цільового. UIView.animateKeyframes розбиває загальну тривалість на кілька кроків (keyframes) з різними відносними стартом та тривалістю. Keyframe підходить для багатоетапних послідовностей.
Анімації UIView.animate обробляються в render server (backboardd) — окремому процесі iOS. Головний потік тільки надсилає початкові та кінцеві значення властивостей. Інтерполяція кадрів виконується на GPU через Core Animation з частотою до 120 FPS.
Викличте layer.removeAllAnimations() на UIView — це видалить всі CAAnimations, створені під капотом. Для більш точного контролю використовуйте CATransaction та ідентифікатори анімацій через CAAnimation.keyPath.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.