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