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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође