UIView.animate: що це, анімація властивостей UIView в iOS

Автор: IT Sectr Опубліковано: 2026-03-01 Час читання: 8 хв

UIView.animate — основний метод анімації властивостей UIView в iOS, реалізований в UIKit через блоки з duration, delay та options. Метод анімує frame, alpha, transform, backgroundColor та інші анімовані властивості. Стаття описує синтаксис, параметри, практичні приклади та внутрішній устрій анімацій UIKit.

Головне

  • UIView.animate — блочний метод анімації властивостей UIView: frame, alpha, transform, backgroundColor
  • Параметри — duration (сек), delay (сек), options (крива, повтор, автоповорот), completion (замикання)
  • Spring-анімація — UIView.animate(withDuration:delay:usingSpringWithDamping:) з фізичним відскоком
  • Keyframe-анімація — UIView.animateKeyframes для багатокрокових послідовностей з відносним часом
  • Core Animation — під капотом UIView.animate використовує CABasicAnimation на рівні CALayer

Що таке UIView.animate?

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.

ПараметрТипОпис
durationTimeIntervalТривалість анімації в секундах (тип Double)
delayTimeIntervalЗатримка перед стартом анімації
optionsUIView.AnimationOptionsБітова маска: curve, repeat, autoreverse, layoutSubviews
animations() -> VoidБлок зі змінами анімованих властивостей
completion(Bool) -> VoidЗамикання після завершення анімації

Параметр options комбінується через масив: [.curveEaseOut, .repeat, .autoreverse]. Анімація з repeat та autoreverse плавно повертає View у вихідний стан і повторюється нескінченно. Для скінченної кількості повторів використовуйте animateKeyframes.

Spring-анімація через UIView.animate

Spring-анімація додає фізичний ефект пружини: об'єкт не просто переходить з точки A в B, а «перелітає» ціль із загасаючими коливаннями. Параметри: usingSpringWithDamping (демпфірування 0-1, де 0 — максимальні коливання) та initialSpringVelocity (початкова швидкість пружини).

Apple рекомендує usingSpringWithDamping в діапазоні 0.4-0.8 для природних UI-анімацій. Значення 0.5 створює помітний відскок без відчуття «гумовості». initialSpringVelocity = 1.0 відповідає швидкості в 1 pt/сек. При 0 анімація стартує зі стану спокою.

swift
// Приклад 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
        }
    }
}

Keyframe-анімація

UIView.animateKeyframes дозволяє розбити анімацію на кілька кроків (keyframes), кожен зі своїм відносним часом та тривалістю. Метод addKeyframe(withRelativeStartTime:relativeDuration:) приймає часові значення від 0 до 1 відносно загальної тривалості анімації.

Keyframe-анімації корисні для багатоетапних ефектів: пульсація кнопки (збільшення → пауза → повернення), послідовна поява елементів, складні деформації з проміжними станами. Кожен keyframe може мати свою криву анімації через options.

swift
// 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
        }
    }
}

Внутрішній устрій: Core Animation під капотом

Під капотом 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 можна анімувати?

Анімовані властивості UIView: frame, bounds, center, alpha, transform (CGAffineTransform), backgroundColor. Також анімуються зміни layoutIfNeeded() при зміні обмежень Auto Layout. Інші властивості не анімуються через UIView.animate — для них використовуйте CALayer або CADisplayLink.

Чим відрізняється UIView.animate від UIView.animateKeyframes?

UIView.animate виконує одну анімацію від поточного стану до цільового. UIView.animateKeyframes розбиває загальну тривалість на кілька кроків (keyframes) з різними відносними стартом та тривалістю. Keyframe підходить для багатоетапних послідовностей.

Чому UIView.animate не блокує UI?

Анімації UIView.animate обробляються в render server (backboardd) — окремому процесі iOS. Головний потік тільки надсилає початкові та кінцеві значення властивостей. Інтерполяція кадрів виконується на GPU через Core Animation з частотою до 120 FPS.

Як зупинити UIView.animate до завершення?

Викличте layer.removeAllAnimations() на UIView — це видалить всі CAAnimations, створені під капотом. Для більш точного контролю використовуйте CATransaction та ідентифікатори анімацій через CAAnimation.keyPath.

Підсумки

  • UIView.animate — блочний метод анімації властивостей UIView з duration, delay, options та completion
  • Spring-анімація — usingSpringWithDamping + initialSpringVelocity для фізичного відскоку
  • Keyframe-анімація — UIView.animateKeyframes з addKeyframe для багатокрокових послідовностей
  • Анімовані властивості — frame, bounds, center, alpha, transform, backgroundColor
  • Core Animation — під капотом UIView.animate створює CABasicAnimation для CALayer
  • Render server — анімації обробляються на частоті 120 Гц без блокування головного потоку
  • SwiftUI — рекомендований інструмент для нових проектів, UIKit.animate — для підтримки iOS 16-

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також