CAAnimation — əsas anlayışlar, CAAnimationGroup və təbəqə animasiyaları

Müəllif: IT Sectr Dərc olunub: 2026-03-01 Oxuma vaxtı: 8 dəq

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 — CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition siniflərinin miras aldığı abstrakt baz sinif
  • CAAnimationGroup — ümumi duration və timingFunction ilə bir neçə animasiyanın paralel icrası
  • CAKeyframeAnimation — dəyər və vaxt damğası massivləri ilə açarıq kadrlar üzrə animasiya
  • CAMediaTiming — vaxtı idarəetmə protokolu: duration, repeatCount, autoreverses, timeOffset
  • CATransition — təbəqə vəziyyətləri arasında əvvəlcədən təyin edilmiş keçidlər (fade, push, moveIn, reveal)

CAAnimation nədir?

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.

CAAnimation sinif iyerarxiyası

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.

SinifTəyinatəsas xüsusiyyətlər
CABasicAnimationBir xassəni A-dan B-yə animasiya etməfromValue, toValue, byValue, keyPath
CAKeyframeAnimationBir neçə açarıq kadr üzrə animasiyavalues, keyTimes, path, calculationMode
CAAnimationGroupBir neçə animasiyanı qruplaşdırmaanimations massivi, vahid duration
CATransitionTəbəqə vəziyyətləri arasında keçidtype (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 — vaxtı idarəetmə

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 və CAKeyframeAnimation

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.

swift
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. pathcalculationMode = .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.

Swift-də kod nümunələri

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.

swift
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 və CAKeyframeAnimation arasındakı fərq nədir?

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 nə vaxt istifadə edilməlidir?

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.

CAAnimation-da fillMode nədir?

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-u CALayer animasiyasından necə fərqləndirmək olar?

CAAnimationCALayer-ə 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ə

  • CAAnimation — CAMediaTiming və CAMediaTimingFillMode tətbiqi ilə Core Animation abstrakt baz sinifi
  • Sinif iyerarxiyası — CABasicAnimation (bir xassə), CAKeyframeAnimation (çoxlu kadr), CAAnimationGroup (qruplaşdırma), CATransition (keçidlər)
  • CAMediaTiming — duration, repeatCount, autoreverses, beginTime, timeOffset, speed, fillMode protokolu
  • CAAnimationGroup — vahid duration və timingFunction ilə animasiyaların paralel icrası
  • CAKeyframeAnimation — calculationMode ilə values/keyTimes və ya path (Bézier əyrisi) üzrə animasiya
  • CATransition — subtype konfiqurasiyası ilə əvvəlcədən təyin edilmiş növlər: fade, push, moveIn, reveal
  • Idarəetmə — layer.add(animation, forKey:), removeAnimation(forKey:), removeAllAnimations()

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.

Layihəni müzakirə et

Həm də oxuyun