UIView.animate — основният метод за анимация на свойствата на UIView в iOS, реализиран в UIKit чрез блокове с duration, delay и options. Методът анимира frame, alpha, transform, backgroundColor и други анимируеми свойства. Статията описва синтаксиса, параметрите, практически примери и вътрешното устройство на UIKit анимациите.
Основни точки
UIView.animate — статичен метод на класа UIView, въведен в iOS 4 (2010). Той предоставя декларативен API за анимация на анимируемите свойства на 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 Hz (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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също