CAAnimation — Schlüsselkonzepte, CAAnimationGroup und Layer-Animationen

Autor: IT Sectr Veröffentlicht: 2026-03-01 Lesezeit: 8 Min.

CAAnimation ist eine abstrakte Basisklasse von Core Animation, die die gemeinsame Schnittstelle für alle Animationstypen definiert: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition. Der Artikel erklärt die Klassenhierarchie, Schlüsseleigenschaften, Animationsgruppierung und praktische Beispiele in Swift.

Wichtige Erkenntnisse

  • CAAnimation — abstrakte Basisklasse von Core Animation, von der CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition erben
  • CAAnimationGroup — parallele Ausführung mehrerer Animationen mit gemeinsamer duration und timingFunction
  • CAKeyframeAnimation — Keyframe-Animation mit Arrays von Werten und Zeitstempeln
  • CAMediaTiming — Zeitverwaltungsprotokoll: duration, repeatCount, autoreverses, timeOffset
  • CATransition — vordefinierte Übergänge zwischen Layer-Zuständen (fade, push, moveIn, reveal)

Was ist CAAnimation?

CAAnimation ist eine abstrakte Klasse von Core Animation, die die gemeinsame Schnittstelle für alle Animationen definiert. Sie implementiert das CAMediaTiming-Protokoll (Dauer, Wiederholung, Auto-Rücklauf) und CAMediaTimingFillMode (Verhalten vor/nach der Animation). CAAnimation kann nicht direkt instanziiert werden — verwenden Sie eine seiner Unterklassen: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, CATransition oder CAAnimation (über animationForKeyPath).

Jede CAAnimation wird einem CALayer über die Methode add(_:forKey:) hinzugefügt. Der Parameter forKey ist ein eindeutiger Animationsbezeichner auf dem Layer. Ein keyPath kann nur eine aktive Animation haben. Um eine Animation zu ersetzen, verwenden Sie removeAnimation(forKey:) vor dem Hinzufügen einer neuen.

Laut Apple ist CAAnimation eine "temporäre" Änderung des Layers. Nach Abschluss der Animation kehrt der Präsentations-Layer zu den Werten des Modell-Layers zurück, wenn fillMode und isRemovedOnCompletion nicht gesetzt sind.

CAAnimation Klassenhierarchie

Core Animation bietet vier Hauptunterklassen von CAAnimation, jede für ihr eigenes Animationsszenario. Das Verständnis der Hierarchie hilft, den richtigen Typ für die Aufgabe auszuwählen.

KlasseZweckHauptmerkmale
CABasicAnimationAnimiert eine Eigenschaft von A nach BfromValue, toValue, byValue, keyPath
CAKeyframeAnimationAnimation über mehrere Keyframesvalues, keyTimes, path, calculationMode
CAAnimationGroupGruppiert mehrere Animationenanimations-Array, einzelne duration
CATransitionÜbergang zwischen Layer-Zuständentype (fade/push/moveIn/reveal), subtype, startProgress

CABasicAnimation ist die einfachste und beliebteste Unterklasse. CAKeyframeAnimation wird für komplexe Bahnen (z. B. Bewegung entlang einer Bezier-Kurve) verwendet. CAAnimationGroup führt mehrere Animationen parallel aus. CATransition ist ein vorgefertigter Übergang zwischen Bildern oder Inhaltszuständen.

CAMediaTiming — Zeitverwaltung

Das CAMediaTiming-Protokoll ist ein grundlegender Bestandteil von CAAnimation. Es definiert die grundlegenden Zeiteigenschaften: duration, repeatCount, repeatDuration, autoreverses, beginTime (Startzeit relativ zum Elternteil), timeOffset (Versatz innerhalb eines Zyklus), speed (Wiedergabegeschwindigkeit).

Die Eigenschaft fillMode (CAMediaTimingFillMode) bestimmt die Layer-Anzeige vor (backwards) und nach (forwards) der Animation. Werte: removed (Standard — Rückkehr zum Modell-Layer), forwards (bleibt im Endzustand), backwards (zeigt den Anfangszustand vor dem Start), both (kombiniert beide Verhaltensweisen). fillMode funktioniert nur, wenn isRemovedOnCompletion = false ist.

CAAnimation erbt CAMediaTiming und kann in eine Eltern-Animation (CAAnimationGroup) eingebettet werden. In diesem Fall wird beginTime relativ zum Start des Elternteils berechnet und duration durch die Dauer des Elternteils begrenzt. Speed = 2.0 verdoppelt die Animationsgeschwindigkeit.

CAAnimationGroup und CAKeyframeAnimation

CAAnimationGroup fasst mehrere CAAnimation-Instanzen zu einer Gruppe zusammen. Alle untergeordneten Animationen starten parallel, es sei denn, beginTime wird für jede festgelegt. Die Gruppe hat eine eigene duration, die die maximale Dauer der untergeordneten Animationen begrenzt. Die timingFunction der Gruppe wird als Standardwert verwendet, wenn eine untergeordnete Animation keine eigene festlegt.

CAKeyframeAnimation animiert eine Eigenschaft über mehrere Keyframes, die durch ein Array von values definiert sind. Der Parameter keyTimes (Array von NSNumber von 0 bis 1) definiert die Zeitstempel für jeden Frame. calculationMode spezifiziert die Interpolation: linear, discrete (keine Interpolation), paced (gleichmäßige Geschwindigkeit), cubic (Spline), cubicPaced.

swift
import QuartzCore

// CAAnimationGroup — Animationskombination
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 — Bewegung entlang einer Bahn
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 mit benutzerdefinierten Werten
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 // relativ zur aktuellen Position
    layer.add(bounce, forKey: nil)
}

CAAnimationGroup führt fade, scale und rotate parallel mit einer Dauer von 2.0 aus. CAKeyframeAnimation mit path und calculationMode = .cubicPaced sorgt für gleichmäßige Bewegung entlang einer Bezier-Kurve mit automatischer Rotation (rotationMode = .auto). bounceAnimation verwendet isAdditive für relativen Versatz.

Swift-Codebeispiele

Ein vollständiges CAAnimation-Beispiel für komplexe Layer-Animationen mit CATransition zum Inhaltswechsel und CAAnimationGroup für Pulseffekte.

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 — Übergang zwischen Zuständen
        let transition = CATransition()
        transition.type = .fade
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        demoLayer.add(transition, forKey: nil)

        // Inhalt per Transaktion ändern
        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 mit type: .fade erzeugt einen sanften Übergang zwischen zwei backgroundColor-Zuständen. CAAnimationGroup kombiniert scale, opacity und shadowOpacity für einen Pulseffekt. removeAllAnimations() bricht alle Animationen ab und setzt den Layer auf seine ursprünglichen Modell-Layer-Werte zurück.

Häufig gestellte Fragen

Was ist der Unterschied zwischen CABasicAnimation und CAKeyframeAnimation?

CABasicAnimation animiert eine Eigenschaft von einem Anfangswert (fromValue) zu einem Endwert (toValue) mit gleichmäßiger Interpolation. CAKeyframeAnimation ermöglicht die Angabe eines Arrays von Zwischenwerten (values) und Zeitstempeln (keyTimes) für eine nichtlineare Keyframe-Animation, einschließlich kurvenbasierter Bewegung über path.

Wann sollte CAAnimationGroup verwendet werden?

CAAnimationGroup wird benötigt, wenn mehrere Animationen parallel mit garantierter Synchronisation ausgeführt werden müssen: Die Gruppendauer begrenzt alle untergeordneten Animationen. Verwenden Sie group für kombinierte Effekte: Skalierung + Deckkraftänderung + Rotation gleichzeitig.

Was ist fillMode in CAAnimation?

fillMode bestimmt die Layer-Anzeige vor (backwards) und nach (forwards) der Animation. Der Wert .forwards hält den Layer nach Abschluss der Animation im Endzustand (erfordert isRemovedOnCompletion = false). .both kombiniert backwards (Anfangszustand vor Start) und forwards.

Wie unterscheidet sich CAAnimation von CALayer-Animation?

CAAnimation ist ein Animationsobjekt (Anweisung), das einem CALayer über layer.add(animation, forKey:) hinzugefügt wird. Die Animation existiert als separates Objekt, kann wiederverwendet (durch Kopieren) und über CAMediaTiming verwaltet werden. Ein Layer kann mehrere Animationen mit verschiedenen Schlüsseln haben.

Zusammenfassung

  • CAAnimation — abstrakte Basisklasse von Core Animation, die CAMediaTiming und CAMediaTimingFillMode implementiert
  • Klassenhierarchie — CABasicAnimation (eine Eigenschaft), CAKeyframeAnimation (mehrere Frames), CAAnimationGroup (Gruppierung), CATransition (Übergänge)
  • CAMediaTiming — Protokoll mit duration, repeatCount, autoreverses, beginTime, timeOffset, speed, fillMode
  • CAAnimationGroup — parallele Animationsausführung mit einer einzigen duration und timingFunction
  • CAKeyframeAnimation — Animation über values/keyTimes oder path (Bezier-Kurve) mit calculationMode
  • CATransition — vordefinierte Typen: fade, push, moveIn, reveal mit subtype-Konfiguration
  • Verwaltung — layer.add(animation, forKey:), removeAnimation(forKey:), removeAllAnimations()

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch