CALayer — az iOS grafikus rétegeinek alaposztálya, amely a QuartzCore keretrendszer része. Minden UIView iOS-ben rendelkezik egy kapcsolódó CALayer-rel, amely biztosítja a tartalom megjelenítését, animációját és kompozícióját a GPU-n. A Apple QuartzCore Documentation, 2025 szerint a CALayer több mint 40 animálható tulajdonságot támogat és közvetlenül a Metal-on keresztül működik. A CALayer megértése elengedhetetlen a gördülékeny animációk létrehozásához és a felület teljesítményének optimalizálásához.
Főbb pontok
CALayer — egy osztály a QuartzCore keretrendszerből, amely a képernyő egy téglalap alakú területének raszterképét kezeli. Vizuális tulajdonságokat tárol: frame, backgroundColor, opacity, shadow, border, transform. Az UIView-től eltérően a CALayer nem dolgozza fel az érintési eseményeket, nem vesz részt az Auto Layout-ban, és nem rendelkezik view controller életciklussal.
Architekturálisan a CALayer a Model mintát valósítja meg a Core Animation kontextusában. A réteg tárolja a vizuális tulajdonságok állapotát, a Core Animation pedig az állapotok közötti interpolációt kezeli az animáció során. Ez a szétválasztás lehetővé teszi a réteg bármely tulajdonságának animálását anélkül, hogy a tartalmat újra kellene rajzolni a drawRect-en keresztül.
A Apple WWDC 2024 szerint a CALayer-t átírták a Metal-on keresztüli működéshez. A modern megjelenítési csœvezeték három fázist tartalmaz: Commit (tulajdonságok frissítése a CPU-n), Render (GPU parancsok generálása a CPU-n) és Composite (parancsok végrehajtása a GPU-n). A CALayer mindhárom fázisban részt vesz, adatokat szolgáltatva mindegyikhez.
Minden réteg tartalmazhat sublayers — gyermek rétegeket, amelyek a szülő réteg felett jelennek meg. A rétegek hierarchiája megismétli az UIView hierarchiáját, de külön is létezhet. A fejlesztő létrehozhat rétegeket az UIView-től függetlenül a CALayer() segítségével, és hozzáadhatja azokat a hierarchiához az addSublayer-en keresztül.
UIView — egy réteg a CALayer felett, amely hozzáadja: az érintés feldolgozását a UIResponderen keresztül, részvételt az Auto Layout-ban, megjelenítést a storyboard-ban, integrációt az UIViewController-rel. CALayer — egy könnyű objektum, amely UIView nélkül használható tiszta vizuális elemekhez.
A gyakorlatban ez azt jelenti, hogy ha egy elemnek nincs szüksége érintésre és layout-ra, CALayer-ként implementálható. Például háttéranimációk, töltőjelzők, dekoratív elemek — mindezek hatékonyabban implementálhatók a CALayer-en keresztül, elkerülve az UIView túlterhelését.
Alapvető tulajdonságok magukban foglalják a keretet, pozicionálást, megjelenítést és vizuális effekteket. A frame meghatározza a réteg téglalap alakú területét a szülő koordinátáiban, a bounds — a belső koordinátákat, a position — a réteg középpontját. A position változtatása alapértelmezetten animált az implicit animation-en keresztül.
A contents tulajdonság lehetővé teszi a réteg rasztertartalmának közvetlen beállítását — CGImage vagy CIImage segítségével. Ez alternatíva a drawRect-en keresztüli rajzoláshoz: ha a kép már kész, átadható a contents-nek, és a Core Animation további feldolgozás nélkül jeleníti meg.
Az animációkhoz CABasicAnimation, CAKeyframeAnimation és CATransition használható. Mindezek az osztályok a CALayer tulajdonságok kulcsútjain keresztül működnek, ami lehetővé teszi szinte bármely attribútum animálását — a position-től a transform.rotation.z-ig.
Apple több speciális CALayer alosztályt kínál, amelyek mindegyike egy adott feladatot old meg. A megfelelő alosztály választása az alap CALayer helyett jelentős teljesítménynövekedést eredményezhet a hardveres gyorsításnak köszönhetően.
CAReplicatorLayer különösen hasznos ismétlődő minták létrehozásához kódduplikáció nélkül. Például egy 10 pontból álló töltőjelző egyetlen CAReplicatorLayer-rel implementálható instanceCount = 10 és animációs időeltolás instanceDelay paraméterekkel.
CALayer megjelenítése három fázison megy keresztül. Commit — a réteg tulajdonságának változásakor a CPU-n változáscsomag képződik. Render — a Core Animation Metal parancsokat generál a CPU-n a réteg tulajdonságai alapján. Composite — a GPU végrehajtja a parancsokat és megjeleníti a képkockát a képernyőn. Az egész folyamat szinkronizálva van a kijelző frissítési gyakoriságával.
Több réteg kompozíciója során a GPU egyesíti őket egy végső képpé, figyelembe véve az átlátszóságot, maszkokat és keverési módokat. Ha a réteg opaque = true értékkel rendelkezik, a Core Animation optimalizálja a kompozíciót: az alfa keverés helyett egyszerű pixelcsere történik, ami lényegesen gyorsabb.
Az Apple Performance Guidelines szerint a CALayer megjelenítését lassító fő tényezők: összetett sublayers hierarchia (több mint 30 réteg a képernyőn), maszkok használata (mask tulajdonság), automatikus árnyékszámítás shadowPath nélkül, a shouldRasterize túlzott használata dinamikus rétegekhez.
A Core Animation Instrument eszköz az XCode-ban lehetővé teszi az egyes rétegek megjelenítési idejének, az offscreen pufferek számának és a drawRect hívások gyakoriságának figyelését. Optimális megjelenítési idő 60 FPS-hez — legfeljebb 8 ms a CPU-n és 8 ms a GPU-n.
Offscreen megjelenítés — a réteg megjelenítése egy köztes pufferben, mielőtt a képernyőre kerülne. Akkor fordul elő, amikor cornerRadius + masksToBounds-t használunk tartalommal, csoportos opacity-t, maszkokat és shouldRasterize-t. Minden offscreen menet 2–5 ms-ig tart, ezért a túlzott offscreen megjelenítés kritikus a teljesítmény szempontjából.
Az offscreen megjelenítés diagnosztizálásához használja a Color Offscreen-Rendered eszközt a Core Animation Instrument-ben. A sárga rétegek — offscreen, a kék rétegek — közvetlen megjelenítés a képernyőre. Az offscreen menetek minimalizálása a kulcsfontosságú optimalizálási technika iOS-ben.
Az első példa a CALayer alapkonfigurációját mutatja árnyék létrehozásával, sarkok lekerekítésével és szegéllyel. A shadowPath explicit módon van beállítva a megjelenítés gyorsítása érdekében:
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
}
A második példa — a transform animálása CABasicAnimation segítségével perspektivikus 3D transzformációval. Az Y tengely körüli forgás animációja a kártya megfordításának hatását kelti:
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")
A harmadik példa — a CAGradientLayer használata háttérgradiens létrehozásához. A gradiens a GPU-n jelenik meg, és nem igényel többleterőforrásokat a méret változtatásakor:
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)
}
Gyakran ismételt kérdések
UIView — egy réteg a CALayer felett, amely érintéskezelést, Auto Layout-et és UIViewController integrációt ad hozzá. A CALayer csak a vizuális megjelenítéssel és animációval foglalkozik, ami könnyebbé és hatékonyabbá teszi a tisztán grafikus feladatokhoz.
Több mint 40 tulajdonság, beleértve position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth és borderColor. Az animáció automatikusan elindul, amikor a tulajdonság megváltozik az UIView.animate animációs blokkján belül.
Állítsa be a shadowPath-et — egy explicit árnyékkontúrt UIBezierPath formájában. ShadowPath nélkül a Core Animation elemzi a tartalom alfa csatornáját az árnyék alakjának kiszámításához, ami további menetet igényel. ShadowPath-pel az árnyék egyszerű geometriai alakzatként jelenik meg tartalomelemzés nélkül.
Implicit animation — automatikus animáció, amikor a CALayer egy animálható tulajdonsága megváltozik az UIView.animate blokkon kívül. Az alapértelmezett időtartam — 0,25 másodperc. Letiltható a CATransaction.setDisableActions(true) segítségével, vagy saját időtartam állítható be a CATransaction.begin/commit segítségével.
CAShapeLayer hatékonyabb, ha vektoros alakzatot — vonalat, kört, sokszöget, összetett kontúrt kell megjeleníteni. Az útvonalat a GPU-n jeleníti meg külön raszterpuffer létrehozása nélkül. Az alap CALayer téglalap alakú területekhez alkalmas háttérrel, szegéllyel és árnyékkal.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is