CAAnimation — Core Animation-ın bütün animasiya növləri üçün ümumi interfeysi təyin edən abstrakt baz sinif: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition. Məqalə sinif iyerarxiyasını, əsas xüsusiyyətləri, animasiya qruplaşdırmanı və Swift-də praktik nümunələri izah edir.
Başlıca
CAAnimation — bütün animasiyalar üçün ümumi interfeysi təyin edən Core Animation abstrakt sinifi. O, CAMediaTiming (vaxt, təkrarlama, avtomatik qaytarma) və CAMediaTimingFillMode (animasiyadan əvvəl/sonra davranış) protokollarını tətbiq edir. CAAnimation birbaşa yaradıla bilməz — alt siniflərdən birini istifadə edin: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition və ya CAAnimation (animationForKeyPath vasitəsilə).
Hər bir CAAnimation CALayer-ə add(_:forKey:) metodu ilə əlavə edilir. forKey parametri təbəqədəki animasiyanın unikal identifikatorudur. Eyni keyPath yalnız bir aktiv animasiyaya malik ola bilər. Animasiyanı əvəz etmək üçün yenisini əlavə etməzdən əvvəl removeAnimation(forKey:) istifadə edin.
Apple-a görə, CAAnimation təbəqənin müvəqqəti dəyişikliyidir. Animasiya bitdikdən sonra, fillMode və isRemovedOnCompletion təyin edilməyibsə, presentation layer model layer dəyərlərinə qayıdır.
Core Animation CAAnimation-un dörd əsas alt sinfini təqdim edir, hər biri öz animasiya ssenarisi üçündür. İyerarxiyanı başa düşmək tapşırıq üçün düzgün növü seçməyə kömək edir.
| Sinif | Təyinat | əsas xüsusiyyətlər |
|---|---|---|
| CABasicAnimation | Bir xassəni A-dan B-yə animasiya etmə | fromValue, toValue, byValue, keyPath |
| CAKeyframeAnimation | Bir neçə açarıq kadr üzrə animasiya | values, keyTimes, path, calculationMode |
| CAAnimationGroup | Bir neçə animasiyanı qruplaşdırma | animations massivi, vahid duration |
| CATransition | Təbəqə vəziyyətləri arasında keçid | type (fade/push/moveIn/reveal), subtype, startProgress |
CABasicAnimation — ən sadə və populyar alt sinif. CAKeyframeAnimation mürəkkəb traektoriyalar üçün istifadə olunur (məs. Bézier əyrisi ilə hərəkət). CAAnimationGroup bir neçə animasiyanı paralel işə salır. CATransition — şəkillər və ya məzmun vəziyyətləri arasında hazır keçid.
CAMediaTiming protokolu — CAAnimation-un əsas hissəsi. O, əsas vaxt xüsusiyyətlərini təyin edir: duration (müddət), repeatCount (təkrarlama sayı), repeatDuration (ümumi təkrarlama müddəti), autoreverses (əvvəlinə qayıtma), beginTime (valideynə nisbətən başlanğıc vaxtı), timeOffset (bir dövr daxilində yerdəyişmə), speed (oxutma sürəti).
fillMode xassəsi (CAMediaTimingFillMode) animasiyadan əvvəl (backwards) və sonra (forwards) təbəqənin göstərilməsini təyin edir. Dəyərlər: removed (standart — model layer-ə qayıdış), forwards (son vəziyyətdə qalır), backwards (başlanğıcdan əvvəl ilkin vəziyyəti göstərir), both (hər iki davranışı birləşdirir). fillMode yalnız isRemovedOnCompletion = false olduqda işləyir.
CAAnimation CAMediaTiming-i miras alır və valideyn animasiyasına (CAAnimationGroup) yerləşdirilə bilər. Bu halda beginTime valideynin başlanğıcına nisbətən hesablanır, duration isə valideyn tərəfindən məhdudlaşdırılır. Speed = 2.0 animasiyanı iki qat sürətləndirir.
CAAnimationGroup bir neçə CAAnimation-u bir qrupda birləşdirir. Bütün alt animasiyalar, hər biri üçün beginTime təyin edilməyibsə, paralel işə başlayır. Qrupun öz duration-u var, o, alt animasiyaların maksimum müddətini məhdudlaşdırır. Qrupun timingFunction-ı, alt animasiyanın özü təyin etməyibsə, standart dəyər kimi tətbiq edilir.
CAKeyframeAnimation xassəni values massivi ilə təyin edilmiş bir neçə açarıq kadr üzrə animasiya edir. keyTimes parametri (0-dan 1-ə qədər NSNumber massivi) hər kadr üçün vaxt damğasını təyin edir. calculationMode interpolyasiyanı təyin edir: linear, discrete (interpolyasiyasız), paced (vahid sürət), cubic (splayn), cubicPaced.
import QuartzCore
// CAAnimationGroup — animasiyaların kombinasiyası
func complexLayerAnimation(_ layer: CALayer) {
let fade = CABasicAnimation(keyPath: "opacity")
fade.fromValue = 1.0
fade.toValue = 0.3
let scale = CABasicAnimation(keyPath: "transform.scale")
scale.fromValue = 1.0
scale.toValue = 1.5
let rotate = CABasicAnimation(keyPath: "transform.rotation.z")
rotate.fromValue = 0
rotate.toValue = Double.pi * 2
let group = CAAnimationGroup()
group.animations = [fade, scale, rotate]
group.duration = 2.0
group.repeatCount = .infinity
group.autoreverses = true
layer.add(group, forKey: "pulse")
}
// CAKeyframeAnimation — traektoriya üzrə hərəkət
func animateAlongPath(_ layer: CALayer) {
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addCurve(
to: CGPoint(x: 200, y: 300),
controlPoint1: CGPoint(x: 100, y: 0),
controlPoint2: CGPoint(x: 100, y: 300)
)
let anim = CAKeyframeAnimation(keyPath: "position")
anim.path = path.cgPath
anim.duration = 1.5
anim.calculationMode = .cubicPaced
anim.rotationMode = .auto
anim.fillMode = .forwards
anim.isRemovedOnCompletion = false
layer.add(anim, forKey: "pathAnim")
layer.position = CGPoint(x: 200, y: 300)
}
// CAKeyframeAnimation fərdi dəyərlərlə
func bounceAnimation(_ layer: CALayer) {
let bounce = CAKeyframeAnimation(keyPath: "position.y")
bounce.values = [0, -50, 0, -25, 0, -10, 0]
bounce.keyTimes = [0, 0.15, 0.3, 0.45, 0.6, 0.8, 1.0]
bounce.duration = 0.8
bounce.timingFunction = CAMediaTimingFunction(name: .easeOut)
bounce.isAdditive = true // cari vəziyyətə nisbətən
layer.add(bounce, forKey: nil)
}CAAnimationGroup duration 2.0 ilə fade, scale və rotate-i paralel icra edir. path və calculationMode = .cubicPaced ilə CAKeyframeAnimation avtomatik fırlanma (rotationMode = .auto) ilə Bézier əyrisi boyunca vahid hərəkət təmin edir. bounceAnimation nisbi yerdəyişmə üçün isAdditive istifadə edir.
Məzmun dəyişikliyi üçün CATransition və pulsasiya üçün CAAnimationGroup istifadə edən kompleks təbəqə animasiyasının tam CAAnimation nümunəsi.
import UIKit
import QuartzCore
class AnimationDemoView: UIView {
private let demoLayer = CALayer()
private var currentColor: CGColor = UIColor.systemBlue.cgColor
override func layoutSubviews() {
super.layoutSubviews()
demoLayer.frame = CGRect(x: bounds.midX - 40, y: bounds.midY - 40,
width: 80, height: 80)
demoLayer.backgroundColor = currentColor
demoLayer.cornerRadius = 12
layer.addSublayer(demoLayer)
}
func animateTransition() {
// CATransition — vəziyyətlər arasında keçid
let transition = CATransition()
transition.type = .fade
transition.duration = 0.5
transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
demoLayer.add(transition, forKey: nil)
// Məzmunu transaksiya vasitəsilə dəyişirik
currentColor = currentColor == UIColor.systemBlue.cgColor
? UIColor.systemRed.cgColor
: UIColor.systemBlue.cgColor
demoLayer.backgroundColor = currentColor
}
func startPulse() {
let scaleUp = CABasicAnimation(keyPath: "transform.scale")
scaleUp.fromValue = 1.0
scaleUp.toValue = 1.3
let fadeOut = CABasicAnimation(keyPath: "opacity")
fadeOut.fromValue = 1.0
fadeOut.toValue = 0.6
let glow = CABasicAnimation(keyPath: "shadowOpacity")
glow.fromValue = 0.0
glow.toValue = 0.8
let group = CAAnimationGroup()
group.animations = [scaleUp, fadeOut, glow]
group.duration = 1.2
group.autoreverses = true
group.repeatCount = .infinity
group.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
demoLayer.add(group, forKey: "pulse")
}
func stopAnimations() {
demoLayer.removeAllAnimations()
demoLayer.transform = CATransform3DIdentity
demoLayer.opacity = 1.0
demoLayer.shadowOpacity = 0.0
}
}type: .fade ilə CATransition iki backgroundColor vəziyyəti arasında hamar keçid yaradır. CAAnimationGroup pulsasiya effekti üçün scale, opacity və shadowOpacity-i birləşdirir. removeAllAnimations() bütün animasiyaları sıfırlayır və təbəqəni model layer-in ilkin dəyərlərinə qaytarır.
Tez-tez verilən suallar
CABasicAnimation xassəni başlanğıc (fromValue) dəyərdən son (toValue) dəyərə qədər vahid interpolyasiya ilə animasiya edir. CAKeyframeAnimation qeyri-xətti kadr animasiyası üçün aralıq dəyərlər (values) və vaxt damğası (keyTimes) massivi təyin etməyə imkan verir, o cümledən path vasitəsilə əyri üzrə hərəkət.
CAAnimationGroup bir neçə animasiya sinxronizasiya zəmanəti ilə paralel icra edilməli olduqda lazımdır: qrup duration-u bütün alt animasiyaları məhdudlaşdırır. Kombinə edilmiş effektlər üçün qrupdan istifadə edin: miqyaslama + şəffaflıq dəyişikliyi + fırlanma eyni anda.
fillMode animasiyadan əvvəl (backwards) və sonra (forwards) təbəqənin göstərilməsini təyin edir. .forwards dəyəri animasiya bitdikdən sonra təbəqəni son vəziyyətdə saxlayır (isRemovedOnCompletion = false tələb edir). .both backwards (başlanğıcdan əvvəl ilkin vəziyyət) və forwards-i birləşdirir.
CAAnimation — CALayer-ə layer.add(animation, forKey:) vasitəsilə əlavə edilən animasiya obyekti (təlimat). Animasiya ayrıca obyekt kimi mövcuddur, təkrar istifadə edilə bilər (kopyalama ilə) və CAMediaTiming vasitəsilə idarə olunur. Təbəqə müxtəlif açarlarla çoxlu animasiyaya malik ola bilər.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun