CALayer — je základní třídou grafických vrstev v iOS, která je součástí frameworku QuartzCore. Každý UIView v iOS má přidružený CALayer, který zajišťuje vykreslování obsahu, animaci a kompozici na GPU. Podle Apple QuartzCore Documentation, 2025 podporuje CALayer více než 40 animovatelných vlastností a pracuje přímo prostřednictvím Metal. Porozumění CALayer je nezbytné pro vytváření plynulých animací a optimalizaci výkonu rozhraní.
Hlavní body
CALayer — je třída z frameworku QuartzCore, která spravuje rastrový obrázek obdélníkové oblasti obrazovky. Ukládá vizuální vlastnosti: frame, backgroundColor, opacity, shadow, border, transform. Na rozdíl od UIView, CALayer nezpracovává dotykové události, neúčastní se Auto Layout a nemá životní cyklus view controlleru.
Architektonicky CALayer implementuje vzor Model v kontextu Core Animation. Vrstva ukládá stav vizuálních vlastností a Core Animation řídí interpolaci mezi stavy během animace. Toto oddělení umožňuje animovat libovolné vlastnosti vrstvy bez nutnosti překreslovat obsah prostřednictvím drawRect.
Podle Apple WWDC 2024 byl CALayer přepsán pro práci prostřednictvím Metal. Moderní pipeline vykreslování zahrnuje tři fáze: Commit (aktualizace vlastností na CPU), Render (generování příkazů pro GPU na CPU) a Composite (provedení příkazů na GPU). CALayer se účastní všech tří fází a poskytuje data pro každou z nich.
Každá vrstva může obsahovat sublayers — dceřiné vrstvy, které se vykreslují nad rodičovskou vrstvou. Hierarchie vrstev opakuje hierarchii UIView, ale může existovat samostatně. Vývojář může vytvářet vrstvy nezávisle na UIView prostřednictvím CALayer() a přidávat je do hierarchie přes addSublayer.
UIView — je nástavba nad CALayer, která přidává: zpracování dotyků přes UIResponder, účast v Auto Layout, prezentaci v storyboard, integraci s UIViewController. CALayer — je lehký objekt, který lze použít bez UIView pro čistě vizuální prvky.
V praxi to znamená, že pokud prvek nepotřebuje dotyky a layout, lze jej implementovat jako CALayer. Například animace na pozadí, indikátory načítání, dekorativní prvky — vše je efektivnější implementovat přes CALayer, čímž se vyhnete režii UIView.
Základní vlastnosti CALayer zahrnují rámeček, umístění, zobrazení a vizuální efekty. frame definuje obdélníkovou oblast vrstvy v souřadnicích rodiče, bounds — vnitřní souřadnice, position — střed vrstvy. Změna position je ve výchozím nastavení animována prostřednictvím implicit animation.
Vlastnost contents umožňuje přímé nastavení rastrového obsahu vrstvy — prostřednictvím CGImage nebo CIImage. To je alternativa ke kreslení přes drawRect: pokud je obrázek již hotov, lze jej předat do contents a Core Animation jej vykreslí bez dalšího zpracování.
Pro animace se používají CABasicAnimation, CAKeyframeAnimation a CATransition. Všechny tyto třídy pracují prostřednictvím klíčových cest vlastností CALayer, což umožňuje animovat téměř jakýkoli atribut — od position po transform.rotation.z.
Apple poskytuje několik specializovaných podtříd CALayer, z nichž každá řeší konkrétní úkol. Výběr vhodné podtřídy místo základního CALayer může poskytnout významné zvýšení výkonu díky hardwarovému zrychlení.
CAReplicatorLayer je obzvláště užitečný pro vytváření opakujících se vzorů bez duplikace kódu. Například indikátor načítání z 10 bodů je implementován jedním CAReplicatorLayer s instanceCount = 10 a časovým posunem animace instanceDelay.
Vykreslování CALayer probíhá ve třech fázích. Commit — při změně vlastnosti vrstvy se na CPU vytvoří balíček změn. Render — Core Animation generuje Metal příkazy na CPU na základě vlastností vrstvy. Composite — GPU provede příkazy a zobrazí snímek na obrazovce. Celý proces je synchronizován s obnovovací frekvencí displeje.
Při kompozici více vrstev je GPU spojí do výsledného obrázku s přihlédnutím k průhlednosti, maskám a režimům míchání. Pokud má vrstva opaque = true, Core Animation optimalizuje kompozici: místo míchání alfa se provádí jednoduchá výměna pixelů, což je výrazně rychlejší.
Podle Apple Performance Guidelines jsou hlavními faktory zpomalujícími vykreslování CALayer: složitá hierarchie sublayers (více než 30 vrstev na obrazovce), použití masek (vlastnost mask), automatický výpočet stínu bez shadowPath, nadměrné používání shouldRasterize pro dynamické vrstvy.
Nástroj Core Animation Instrument v XCode umožňuje sledovat čas vykreslování každé vrstvy, počet offscreen bufferů a frekvenci volání drawRect. Optimální čas vykreslování pro 60 FPS — ne více než 8 ms na CPU a 8 ms na GPU.
Offscreen vykreslování — vykreslování vrstvy do mezipaměti před zobrazením na obrazovce. Vyskytuje se při použití cornerRadius + masksToBounds s obsahem, skupinové opacity, maskách a shouldRasterize. Každý offscreen průchod trvá 2–5 ms, proto je nadměrné offscreen vykreslování kritické pro výkon.
Pro diagnostiku offscreen vykreslování použijte nástroj Color Offscreen-Rendered v Core Animation Instrument. Žluťé vrstvy — offscreen, modré — přímé vykreslování na obrazovku. Minimalizace offscreen průchodů je klíčovou technikou optimalizace v iOS.
První příklad ukazuje základní konfiguraci CALayer s vytvořením stínu, zaoblením rohů a okrajem. shadowPath je explicitně nastaven pro urychlení vykreslování:
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
}
Druhý příklad — animace transform prostřednictvím CABasicAnimation s perspektivní 3D transformací. Animace rotace kolem osy Y vytváří efekt otáčení 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")
Třetí příklad — použití CAGradientLayer pro vytvoření gradientu pozadí. Gradient se vykresluje na GPU a nevyžaduje další prostředky při změně velikosti:
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)
}
Často kladené otázky
UIView — je nástavba nad CALayer, která přidává zpracování dotyků, Auto Layout a integraci s UIViewController. CALayer pracuje pouze s vizuální reprezentací a animací, což jej činí lehčím a efektivnějším pro čistě grafické úkoly.
Více než 40 vlastností, včetně position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth a borderColor. Animace se spouští automaticky při změně vlastnosti uvnitř animačního bloku UIView.animate.
Nastavte shadowPath — explicitní obrys stínu ve formě UIBezierPath. Bez shadowPath Core Animation analyzuje alfa kanál obsahu pro výpočet tvaru stínu, což vyžaduje další průchod. Se shadowPath se stín vykresluje jako jednoduchý geometrický tvar bez analýzy obsahu.
Implicit animation — automatická animace při změně animovatelné vlastnosti CALayer mimo blok UIView.animate. Výchozí doba trvání — 0,25 sekundy. Lze ji zakázat pomocí CATransaction.setDisableActions(true) nebo nastavit vlastní dobu pomocí CATransaction.begin/commit.
CAShapeLayer je efektivnější, když je třeba zobrazit vektorový tvar — čáru, kruh, mnohoúhelník, složitý obrys. Vykresluje cestu na GPU bez vytváření samostatného rastrového bufferu. Základní CALayer je vhodný pro obdélníkové oblasti s pozadím, okrajem a stínem.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také