CALayer ist die Basisklasse für grafische Ebenen in iOS, Teil des QuartzCore-Frameworks. Jede UIView in iOS hat eine zugehörige CALayer, die Inhalts-Rendering, Animation und GPU-Komposition übernimmt. Laut Apple QuartzCore Documentation, 2025 unterstützt CALayer über 40 animierbare Eigenschaften und arbeitet direkt über Metal. Das Verständnis von CALayer ist für die Erstellung flüssiger Animationen und die Optimierung der Benutzeroberflächenleistung unerlässlich.
Wichtige Punkte
CALayer ist eine Klasse aus dem QuartzCore-Framework, die ein Bitmap-Bild eines rechteckigen Bildschirmbereichs verwaltet. Sie speichert visuelle Eigenschaften: frame, backgroundColor, opacity, shadow, border, transform. Im Gegensatz zu UIView verarbeitet CALayer keine Touch-Ereignisse, nimmt nicht am Auto Layout teil und hat keinen Lebenszyklus eines View Controllers.
Architektonisch implementiert CALayer das Model-Muster im Kontext von Core Animation. Die Ebene speichert den Zustand visueller Eigenschaften, während Core Animation die Interpolation zwischen Zuständen während der Animation verwaltet. Diese Trennung ermöglicht das Animieren beliebiger Ebeneneigenschaften, ohne den Inhalt über drawRect neu zeichnen zu müssen.
Laut Apple WWDC 2024 wurde CALayer für die Arbeit über Metal neu geschrieben. Die moderne Rendering-Pipeline umfasst drei Phasen: Commit (Aktualisieren von Eigenschaften auf der CPU), Render (Generieren von GPU-Befehlen auf der CPU) und Composite (Ausführen von Befehlen auf der GPU). CALayer nimmt an allen drei Phasen teil und liefert Daten für jede.
Jede Ebene kann sublayers enthalten – Unterebenen, die über der Eltern-Ebene gerendert werden. Die Ebenenhierarchie spiegelt die UIView-Hierarchie wider, kann aber unabhängig von ihr existieren. Entwickler können Ebenen unabhängig von UIView über CALayer() erstellen und sie über addSublayer zur Hierarchie hinzufügen.
UIView ist ein Wrapper um CALayer, der Folgendes hinzufügt: Touch-Handling über UIResponder, Teilnahme am Auto Layout, Darstellung im Storyboard und Integration mit UIViewController. CALayer ist ein leichtgewichtiges Objekt, das ohne UIView für rein visuelle Elemente verwendet werden kann.
In der Praxis bedeutet dies, dass ein Element, das keine Touch-Behandlung oder kein Layout benötigt, als CALayer implementiert werden kann. Zum Beispiel Hintergrundanimationen, Ladeanzeigen, dekorative Elemente – all dies lässt sich effizienter über CALayer implementieren und vermeidet den Overhead von UIView.
Basiseigenschaften von CALayer umfassen Rahmen, Positionierung, Anzeige und visuelle Effekte. frame definiert den rechteckigen Bereich der Ebene in Elternkoordinaten, bounds definiert interne Koordinaten und position definiert den Mittelpunkt der Ebene. Die Änderung von position wird standardmäßig durch implizite Animation animiert.
Die contents-Eigenschaft ermöglicht das direkte Festlegen von Bitmap-Inhalten – über CGImage oder CIImage. Dies ist eine Alternative zum Zeichnen über drawRect: Wenn das Bild bereits fertig ist, kann es an contents übergeben werden, und Core Animation rendert es ohne zusätzliche Verarbeitung.
Für Animationen werden CABasicAnimation, CAKeyframeAnimation und CATransition verwendet. Alle diese Klassen arbeiten über CALayer-Eigenschafts-Key-Paths und ermöglichen die Animation praktisch jedes Attributs – von position bis transform.rotation.z.
Apple bietet mehrere spezialisierte CALayer-Unterklassen, die jeweils eine bestimmte Aufgabe lösen. Die Wahl der richtigen Unterklasse anstelle der Basis-CALayer kann durch Hardwarebeschleunigung erhebliche Leistungsverbesserungen bringen.
CAReplicatorLayer ist besonders nützlich zum Erstellen sich wiederholender Muster ohne Code-Duplizierung. Beispielsweise wird ein Ladeindikator mit 10 Punkten mit einem CAReplicatorLayer mit instanceCount = 10 und Animationszeit-Offset instanceDelay implementiert.
Das CALayer-Rendering erfolgt in drei Phasen. Commit – wenn sich eine Ebeneneigenschaft ändert, wird auf der CPU ein Änderungspaket gebildet. Render – Core Animation generiert auf der CPU Metal-Befehle basierend auf den Ebeneneigenschaften. Composite – die GPU führt Befehle aus und gibt den Frame auf dem Bildschirm aus. Der gesamte Prozess ist mit der Bildwiederholfrequenz des Displays synchronisiert.
Bei der Komposition mehrerer Ebenen führt die GPU sie unter Berücksichtigung von Transparenz, Masken und Mischmodi zum endgültigen Bild zusammen. Wenn eine Ebene opaque = true hat, optimiert Core Animation die Komposition: Anstelle von Alpha-Blending wird ein einfacher Pixelersatz durchgeführt, der deutlich schneller ist.
Laut den Apple Performance Guidelines sind die Hauptfaktoren, die das CALayer-Rendering verlangsamen: komplexe sublayer-Hierarchie (mehr als 30 Ebenen auf dem Bildschirm), Verwendung von Masken (mask-Eigenschaft), automatische Schattenberechnung ohne shadowPath und übermäßige Verwendung von shouldRasterize für dynamische Ebenen.
Das Core Animation Instrument in XCode ermöglicht die Überwachung der Rendering-Zeit jeder Ebene, der Anzahl der Offscreen-Puffer und der Häufigkeit von drawRect-Aufrufen. Die optimale Rendering-Zeit für 60 FPS beträgt nicht mehr als 8 ms auf der CPU und 8 ms auf der GPU.
Offscreen-Rendering – das Rendern einer Ebene in einen Zwischenpuffer vor der Anzeige auf dem Bildschirm. Tritt bei Verwendung von cornerRadius + masksToBounds mit Inhalt, Gruppen-Deckkraft, Masken und shouldRasterize auf. Jeder Offscreen-Durchlauf dauert 2–5 ms, daher ist übermäßiges Offscreen-Rendering kritisch für die Leistung.
Zur Diagnose von Offscreen-Rendering verwenden Sie das Werkzeug Color Offscreen-Rendered im Core Animation Instrument. Gelbe Ebenen – Offscreen, blaue – direkte Bildschirmdarstellung. Die Minimierung von Offscreen-Durchläufen ist eine wichtige Optimierungstechnik in iOS.
Das erste Beispiel zeigt die grundlegende CALayer-Konfiguration mit Schattenerstellung, Eckenabrundung und Rahmen. shadowPath wird explizit angegeben, um das Rendering zu beschleunigen:
import UIKit
func configureLayer(_ view: UIView) {
let layer = view.layer
layer.cornerRadius = 16
layer.borderWidth = 2
layer.borderColor = UIColor.systemBlue.cgColor
layer.backgroundColor = UIColor.white.cgColor
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.2
layer.shadowOffset = CGSize(width: 0, height: 4)
layer.shadowRadius = 8
layer.shadowPath = UIBezierPath(
roundedRect: view.bounds,
cornerRadius: layer.cornerRadius
).cgPath
}
Das zweite Beispiel zeigt eine Transform-Animation über CABasicAnimation mit perspektivischer 3D-Transformation. Die Y-Achsen-Rotationsanimation erzeugt einen Kartenumklappeffekt:
let flipAnimation = CABasicAnimation(keyPath: "transform")
var transform = CATransform3DIdentity
transform.m34 = -1.0 / 500.0
transform = CATransform3DRotate(transform, .pi, 0, 1, 0)
flipAnimation.toValue = NSValue(caTransform3D: transform)
flipAnimation.duration = 0.8
flipAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
cardLayer.add(flipAnimation, forKey: "flip")
Das dritte Beispiel demonstriert die Verwendung von CAGradientLayer zum Erstellen eines Hintergrundverlaufs. Der Verlauf wird auf der GPU gerendert und benötigt bei Größenänderung keine zusätzlichen Ressourcen:
func addGradient(to view: UIView, colors: [UIColor]) {
let gradient = CAGradientLayer()
gradient.colors = colors.map { $0.cgColor }
gradient.locations = [0.0, 0.5, 1.0]
gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
gradient.frame = view.bounds
view.layer.insertSublayer(gradient, at: 0)
}
Häufig gestellte Fragen
UIView ist ein Wrapper um CALayer, der Touch-Handling, Auto Layout und UIViewController-Integration hinzufügt. CALayer arbeitet nur mit visueller Darstellung und Animation, was ihn für rein grafische Aufgaben leichter und effizienter macht.
Über 40 Eigenschaften, darunter position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth und borderColor. Die Animation startet automatisch beim Ändern einer Eigenschaft innerhalb eines UIView.animate-Animationsblocks.
Setzen Sie shadowPath – eine explizite Schattenkontur als UIBezierPath. Ohne shadowPath analysiert Core Animation den Alpha-Kanal des Inhalts zur Berechnung der Schattenform, was einen zusätzlichen Durchlauf erfordert. Mit shadowPath wird der Schatten als einfache geometrische Form ohne Inhaltsanalyse gerendert.
Implizite Animation ist die automatische Animation beim Ändern einer animierbaren CALayer-Eigenschaft außerhalb eines UIView.animate-Blocks. Die Standarddauer beträgt 0,25 Sekunden. Sie kann über CATransaction.setDisableActions(true) deaktiviert oder über CATransaction.begin/commit eine benutzerdefinierte Dauer festgelegt werden.
CAShapeLayer ist effizienter, wenn Sie eine Vektorform anzeigen müssen – eine Linie, einen Kreis, ein Polygon oder einen komplexen Pfad. Er rendert einen Pfad auf der GPU ohne Erstellung eines separaten Rasterpuffers. Die Basis-CALayer eignet sich für rechteckige Bereiche mit Hintergrund, Rahmen und Schatten.
Zusammenfassung
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.
Lesen Sie auch