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(), но UIKit.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() при изменении constraint'ов 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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