CAAnimation — kernconcepten, CAAnimationGroup en laaganimaties

Auteur: IT Sectr Gepubliceerd: 2026-03-01 Leestijd: 8 min

CAAnimation — abstracte basisklasse van Core Animation die de gemeenschappelijke interface definieert voor alle soorten animaties: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition. Het artikel legt de klassenhiërarchie, kerneigenschappen, het groeperen van animaties en praktische voorbeelden in Swift uit

Belangrijkste

  • CAAnimation — abstracte basisklasse van Core Animation waarvan CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition overerven
  • CAAnimationGroup — parallelle uitvoering van meerdere animaties met gedeelde duration en timingFunction
  • CAKeyframeAnimation — animatie op sleutelframes met arrays van waarden en tijdstempels
  • CAMediaTiming — protocol voor tijdsbeheer: duration, repeatCount, autoreverses, timeOffset
  • CATransition — vooraf gedefinieerde overgangen tussen laagtoestanden (fade, push, moveIn, reveal)

Wat is CAAnimation?

CAAnimation — abstracte Core Animation-klasse die de gemeenschappelijke interface definieert voor alle animaties. Het implementeert het CAMediaTiming-protocol (tijd, herhaling, automatisch terugkeren) en CAMediaTimingFillMode (gedrag voor/na animatie). CAAnimation kan niet direct worden geïnstantieerd — gebruik een van de subklassen: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition of CAAnimation (via animationForKeyPath).

Elke CAAnimation wordt aan CALayer toegevoegd via de methode add(_:forKey:). De parameter forKey is een unieke identificatie van de animatie op de laag. Hetzelfde keyPath kan slechts één actieve animatie hebben. Gebruik removeAnimation(forKey:) voordat u een nieuwe toevoegt om een animatie te vervangen.

Volgens Apple is CAAnimation een tijdelijke wijziging van de laag. Na voltooiing van de animatie keert presentation layer terug naar de waarden van model layer, tenzij fillMode en isRemovedOnCompletion zijn ingesteld.

Klassenhiërarchie van CAAnimation

Core Animation biedt vier hoofd-subklassen van CAAnimation, elk voor zijn eigen animatiescenario. Inzicht in de hiërarchie helpt bij het kiezen van het juiste type voor de taak.

KlasseDoelKernfuncties
CABasicAnimationAnimaties van één eigenschap van A naar BfromValue, toValue, byValue, keyPath
CAKeyframeAnimationAnimaties over meerdere sleutelframesvalues, keyTimes, path, calculationMode
CAAnimationGroupGroeperen van meerdere animatiesanimaties-array, uniforme duration
CATransitionOvergang tussen laagtoestandentype (fade/push/moveIn/reveal), subtype, startProgress

CABasicAnimation is de eenvoudigste en populairste subklasse. CAKeyframeAnimation wordt gebruikt voor complexe trajecten (bijv. beweging langs een Bezier-curve). CAAnimationGroup start meerdere animaties parallel. CATransition is een kant-en-klare overgang tussen afbeeldingen of inhoudstoestanden.

CAMediaTiming — tijdsbeheer

Het CAMediaTiming-protocol is een fundamenteel onderdeel van CAAnimation. Het definieert de basistijdseigenschappen: duration (duur), repeatCount (aantal herhalingen), repeatDuration (totale herhalingsduur), autoreverses (terugkeer naar begin), beginTime (starttijd ten opzichte van ouder), timeOffset (verschuiving binnen één cyclus), speed (afspeelsnelheid).

De eigenschap fillMode (CAMediaTimingFillMode) bepaalt de weergave van de laag vóór (backwards) en na (forwards) de animatie. Waarden: removed (standaard — terugkeer naar model layer), forwards (blijft in eindtoestand), backwards (toont begintoestand vóór start), both (combineert beide gedragingen). fillMode werkt alleen met isRemovedOnCompletion = false.

CAAnimation erft CAMediaTiming en kan worden genest in een bovenliggende animatie (CAAnimationGroup). In dit geval wordt beginTime berekend ten opzichte van het begin van de ouder, en wordt duration beperkt door de ouder. Speed = 2.0 versnelt de animatie tweemaal.

CAAnimationGroup en CAKeyframeAnimation

CAAnimationGroup combineert meerdere CAAnimation-objecten in één groep. Alle onderliggende animaties starten parallel, tenzij voor elk beginTime is ingesteld. De groep heeft een eigen duration die de maximale duur van onderliggende animaties beperkt. De timingFunction van de groep wordt als standaardwaarde toegepast als de onderliggende animatie geen eigen waarde heeft ingesteld.

CAKeyframeAnimation animeert een eigenschap over meerdere sleutelframes zoals gedefinieerd door de values-array. De parameter keyTimes (een NSNumber-array van 0 tot 1) bepaalt de tijdstempels voor elk frame. calculationMode specificeert de interpolatie: linear, discrete (zonder interpolatie), paced (uniforme snelheid), cubic (spline), cubicPaced.

swift
import QuartzCore

// CAAnimationGroup — combinatie van animaties
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 — beweging langs traject
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 met aangepaste waarden
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 // ten opzichte van huidige positie
    layer.add(bounce, forKey: nil)
}

CAAnimationGroup voert fade, scale en rotate parallel uit met duration 2.0. CAKeyframeAnimation met path en calculationMode = .cubicPaced zorgt voor uniforme beweging langs een Bezier-curve met automatische rotatie (rotationMode = .auto). bounceAnimation gebruikt isAdditive voor relatieve verplaatsing.

Codevoorbeelden in Swift

Volledig CAAnimation-voorbeeld voor complexe laaganimatie met CATransition voor inhoudswisseling en CAAnimationGroup voor pulsatie.

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 — overgang tussen toestanden
        let transition = CATransition()
        transition.type = .fade
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        demoLayer.add(transition, forKey: nil)

        // Inhoud wijzigen via transactie
        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
    }
}

CATransition met type: .fade creëert een vloeiende overgang tussen twee backgroundColor-toestanden. CAAnimationGroup combineert scale, opacity en shadowOpacity voor het pulsatie-effect. removeAllAnimations() reset alle animaties en brengt de laag terug naar de oorspronkelijke waarden van model layer.

Veelgestelde vragen

Wat is het verschil tussen CABasicAnimation en CAKeyframeAnimation?

CABasicAnimation animeert een eigenschap van beginwaarde (fromValue) naar eindwaarde (toValue) met uniforme interpolatie. CAKeyframeAnimation stelt u in staat een array van tussenliggende waarden (values) en tijdstempels (keyTimes) op te geven voor niet-lineaire frame-animatie, inclusief beweging langs een curve via path.

Wanneer CAAnimationGroup gebruiken?

CAAnimationGroup is nodig wanneer meerdere animaties parallel moeten worden uitgevoerd met synchronisatiegarantie: de group duration beperkt alle onderliggende animaties. Gebruik de groep voor gecombineerde effecten: schalen + transparantieverandering + rotatie tegelijkertijd.

Wat is fillMode in CAAnimation?

fillMode bepaalt de weergave van de laag vóór (backwards) en na (forwards) de animatie. De waarde .forwards laat de laag in de eindtoestand na voltooiing van de animatie (vereist isRemovedOnCompletion = false). .both combineert backwards (begintoestand vóór start) en forwards.

Hoe onderscheid ik CAAnimation van CALayer-animatie?

CAAnimation is een animatieobject (instructie) dat aan CALayer wordt toegevoegd via layer.add(animation, forKey:). De animatie bestaat als een apart object, kan opnieuw worden gebruikt (met kopiëren) en wordt beheerd via CAMediaTiming. Een laag kan meerdere animaties met verschillende sleutels hebben.

Samenvatting

  • CAAnimation — abstracte basisklasse van Core Animation met implementatie van CAMediaTiming en CAMediaTimingFillMode
  • Klassenhiërarchie — CABasicAnimation (één eigenschap), CAKeyframeAnimation (meerdere frames), CAAnimationGroup (groepering), CATransition (overgangen)
  • CAMediaTiming — protocol met duration, repeatCount, autoreverses, beginTime, timeOffset, speed, fillMode
  • CAAnimationGroup — parallelle uitvoering van animaties met uniforme duration en timingFunction
  • CAKeyframeAnimation — animatie via values/keyTimes of path (Bezier-curve) met calculationMode
  • CATransition — vooraf gedefinieerde typen: fade, push, moveIn, reveal met configureerbare subtype
  • Beheer — layer.add(animation, forKey:), removeAnimation(forKey:), removeAllAnimations()

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook