CALayer — to podstawowa klasa warstw graficznych w iOS, wchodząca w skład frameworka QuartzCore. Każdy UIView w iOS ma powiązany CALayer, który zapewnia renderowanie treści, animację i kompozycję na GPU. Według Apple QuartzCore Documentation, 2025, CALayer obsługuje ponad 40 animowanych właściwości i działa bezpośrednio przez Metal. Zrozumienie CALayer jest niezbędne do tworzenia płynnych animacji i optymalizacji wydajności interfejsu.
Najważniejsze
CALayer — to klasa z frameworka QuartzCore, która zarządza obrazem rastrowym prostokątnego obszaru ekranu. Przechowuje właściwości wizualne: frame, backgroundColor, opacity, shadow, border, transform. W przeciwieństwie do UIView, CALayer nie obsługuje zdarzeń dotyku, nie uczestniczy w Auto Layout i nie ma cyklu życia kontrolera widoku.
Architektonicznie CALayer realizuje wzorzec Model w kontekście Core Animation. Warstwa przechowuje stan właściwości wizualnych, a Core Animation zarządza interpolacją między stanami podczas animacji. Takie rozdzielenie pozwala animować dowolne właściwości warstwy bez konieczności przerysowywania treści przez drawRect.
Według Apple WWDC 2024, CALayer został przepisany do działania przez Metal. Nowoczesny potok renderowania obejmuje trzy etapy: Commit (aktualizacja właściwości na CPU), Render (generowanie komend dla GPU na CPU) i Composite (wykonywanie komend na GPU). CALayer uczestniczy we wszystkich trzech etapach, dostarczając dane dla każdego z nich.
Każda warstwa może zawierać sublayers — warstwy potomne, które są renderowane nad rodzicielską. Hierarchia warstw powtarza hierarchię UIView, ale może istnieć oddzielnie. Programista może tworzyć warstwy niezależnie od UIView przez CALayer() i dodawać je do hierarchii przez addSublayer.
UIView — to nadbudowa nad CALayer, która dodaje: obsługę dotyku przez UIResponder, udział w Auto Layout, prezentację w storyboard, integrację z UIViewController. CALayer — to lekki obiekt, który można używać bez UIView dla elementów czysto wizualnych.
W praktyce oznacza to, że jeśli element nie potrzebuje dotyku i layoutu, można go zaimplementować jako CALayer. Na przykład animacje tła, wskaźniki ładowania, elementy dekoracyjne — wszystko to efektywniej zaimplementować przez CALayer, unikając narzutu UIView.
Podstawowe właściwości CALayer obejmują ramkę, pozycjonowanie, wyświetlanie i efekty wizualne. frame określa prostokątny obszar warstwy we współrzędnych rodzica, bounds — wewnętrzne współrzędne, position — środek warstwy. Zmiana position jest domyślnie animowana przez implicit animation.
Właściwość contents pozwala ustawić zawartość rastrową warstwy bezpośrednio — przez CGImage lub CIImage. To alternatywa dla rysowania przez drawRect: jeśli obraz jest już gotowy, można go przekazać do contents, a Core Animation wyrenderuje go bez dodatkowego przetwarzania.
Do animacji używa się CABasicAnimation, CAKeyframeAnimation i CATransition. Wszystkie te klasy działają przez ścieżki kluczowe właściwości CALayer, co pozwala animować praktycznie dowolny atrybut — od position do transform.rotation.z.
Apple dostarcza kilka wyspecjalizowanych podklas CALayer, z których każda rozwiązuje konkretne zadanie. Wybór odpowiedniej podklasy zamiast podstawowego CALayer może dać znaczny wzrost wydajności dzięki przyspieszeniu sprzętowemu.
CAReplicatorLayer jest szczególnie przydatny do tworzenia powtarzalnych wzorów bez duplikowania kodu. Na przykład wskaźnik ładowania z 10 punktów jest implementowany przez jeden CAReplicatorLayer z instanceCount = 10 i przesunięciem czasu animacji instanceDelay.
Renderowanie CALayer przebiega w trzech fazach. Commit — przy zmianie właściwości warstwy na CPU tworzony jest pakiet zmian. Render — Core Animation generuje komendy Metal na CPU na podstawie właściwości warstwy. Composite — GPU wykonuje komendy i wyświetla klatkę na ekranie. Cały proces jest zsynchronizowany z częstotliwością odświeżania wyświetlacza.
Przy kompozycji wielu warstw GPU łączy je w końcowy obraz z uwzględnieniem przezroczystości, masek i trybów mieszania. Jeśli warstwa ma opaque = true, Core Animation optymalizuje kompozycję: zamiast mieszania alfa wykonywana jest zwykła zamiana pikseli, co jest znacznie szybsze.
Według Apple Performance Guidelines, główne czynniki spowalniające renderowanie CALayer: złożona hierarchia sublayers (ponad 30 warstw na ekranie), użycie masek (właściwość mask), automatyczne obliczanie cienia bez shadowPath, nadmierne użycie shouldRasterize dla dynamicznych warstw.
Narzędzie Core Animation Instrument w XCode pozwala monitorować czas renderowania każdej warstwy, liczbę buforów offscreen i częstotliwość wywołania drawRect. Optymalny czas renderowania dla 60 FPS — nie więcej niż 8 ms na CPU i 8 ms na GPU.
Offscreen rendering — renderowanie warstwy w pośrednim buforze przed wyświetleniem na ekranie. Występuje przy użyciu cornerRadius + masksToBounds z treścią, grupowej opacity, maskach i shouldRasterize. Każdy przebieg offscreen zajmuje 2–5 ms, dlatego nadmierne renderowanie offscreen jest krytyczne dla wydajności.
Do diagnostyki offscreen rendering użyj narzędzia Color Offscreen-Rendered w Core Animation Instrument. Żółte warstwy — offscreen, niebieskie — bezpośrednie renderowanie na ekran. Minimalizacja przebiegów offscreen — kluczowa technika optymalizacji w iOS.
Pierwszy przykład demonstruje podstawową konfigurację CALayer z tworzeniem cienia, zaokrągleniem rogów i obramowaniem. shadowPath jest ustawiony jawnie dla przyspieszenia renderowania:
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
}
Drugi przykład — animacja transform przez CABasicAnimation z perspektywiczną transformacją 3D. Animacja obrotu wokół osi Y tworzy efekt odwracania karty:
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")
Trzeci przykład — użycie CAGradientLayer do tworzenia gradientu tła. Gradient jest renderowany na GPU i nie wymaga dodatkowych zasobów przy zmianie rozmiarów:
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)
}
Często zadawane pytania
UIView — to nadbudowa nad CALayer, która dodaje obsługę dotyku, Auto Layout i integrację z UIViewController. CALayer działa tylko z reprezentacją wizualną i animacją, co czyni go lżejszym i wydajniejszym do zadań czysto graficznych.
Ponad 40 właściwości, w tym position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth i borderColor. Animacja uruchamiana jest automatycznie przy zmianie właściwości w bloku animacyjnym UIView.animate.
Ustaw shadowPath — jawny kontur cienia w postaci UIBezierPath. Bez shadowPath Core Animation analizuje kanał alfa treści do obliczenia kształtu cienia, co wymaga dodatkowego przebiegu. Z shadowPath cień jest renderowany jako prosta figura geometryczna bez analizy treści.
Implicit animation — automatyczna animacja przy zmianie animowanej właściwości CALayer poza blokiem UIView.animate. Domyślny czas trwania — 0.25 sekundy. Można ją wyłączyć przez CATransaction.setDisableActions(true) lub ustawić własny czas przez CATransaction.begin/commit.
CAShapeLayer jest wydajniejszy, gdy trzeba wyświetlić kształt wektorowy — linię, okrąg, wielokąt, złożony kontur. Renderuje ścieżkę na GPU bez tworzenia osobnego bufora rastrowego. Podstawowy CALayer nadaje się do prostokątnych obszarów z tłem, obramowaniem i cieniem.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również