CALayer — iOS-da QuartzCore çərçivəsinə daxil olan əsas qrafik təbəqə sinifidir. iOS-da hər UIView əlaqəli CALayer-ə malikdir, o, məzmunun render edilməsini, animasiyanı və GPU-da kompozisiyanı təmin edir. Apple QuartzCore Documentation, 2025-yə görə, CALayer 40-dan çox animasiya edilə bilən xüsusiyyəti dəstəkləyir və birbaşa Metal vasitəsilə işləyir. CALayer-i başa düşmək hamar animasiyalar yaratmaq və interfeys performansını optimallaşdırmaq üçün vacibdir.
Əsas məqamlar
CALayer — QuartzCore çərçivəsindən olan, ekranın düzbucaqı iş sahəsinin raster təsvirini idarə edən sinifdir. O, vizual xüsusiyyətləri saxlayır: frame, backgroundColor, opacity, shadow, border, transform. UIView-dən fərqli olaraq, CALayer toxunma hadisələrini emal etmir, Auto Layout-da iştirak etmir və view controller həyat dövrünə malik deyil.
Memarlıq baxımından CALayer Core Animation kontekstində Model nümunəsini həyata keçirir. Təbəqə vizual xüsusiyyətlərin vəziyyətini saxlayır, Core Animation isə animasiya zamanı vəziyyətlər arasında interpolasiyanı idarə edir. Bu ayrılma drawRect vasitəsilə məzmunu yenidən çəkmədən təbəqənin istənilən xüsusiyyətlərini animasiya etməyə imkan verir.
Apple WWDC 2024-yə görə, CALayer Metal vasitəsilə işləmək üçün yenidən yazılmışdır. Müasir render boru kəməri üç mərhələdən ibarətdir: Commit (CPU-da xüsusiyyətlərin yenilənməsi), Render (CPU-da GPU üçün əmrlərin yaradılması) və Composite (GPU-da əmrlərin icrası). CALayer hər üç mərhələdə iştirak edir, hər biri üçün məlumat təqdim edir.
Hər təbəqə sublayers — ana təbəqənin üzərində render edilən uşaq təbəqələri ehtiva edə bilər. Təbəqələr iyerarxiyası UIView iyerarxiyasını təkrarlayır, lakin ondan ayrı mövcud ola bilər. Proqramçı CALayer() vasitəsilə UIView-dən asılı olmayaraq təbəqələr yarada və onları addSublayer vasitəsilə iyerarxiyaya əlavə edə bilər.
UIView — CALayer üzərində əlavədir: UIResponder vasitəsilə toxunma emalı, Auto Layout-da iştirak, storyboard-da təqdimat, UIViewController ilə inteqrasiya. CALayer — yalnız vizual elementlər üçün UIView olmadan istifadə edilə bilən yünül obyektdir.
Praktikada bu o deməkdir ki, element toxunma və layout tələb etməzsə, onu CALayer kimi həyata keçirmək olar. Məsələn, fon animasiyaları, yükləmə göstəriciləri, dekorativ elementlər — bütün bunları UIView yükündən qaçaraq CALayer vasitəsilə həyata keçirmək daha səmərəlidir.
Əsas xüsusiyyətlər çərçivə, yerləşdirmə, göstərmə və vizual effektləri əhatə edir. frame təbəqənin ana koordinatlarında düzbucaqı sahəsini, bounds — daxili koordinatları, position — təbəqənin mərkəzini təyin edir. Position dəyişikliyi implicit animation vasitəsilə default olaraq animasiya olunur.
contents xüsusiyyəti təbəqənin raster məzmununu birbaşa təyin etməyə imkan verir — CGImage və ya CIImage vasitəsilə. Bu drawRect vasitəsilə çəkməyə alternativdir: əgər şəkil artıq hazırdırsa, onu contents-ə ötürmək olar və Core Animation onu əlavə emal olmadan render edəcək.
Animasiyalar üçün CABasicAnimation, CAKeyframeAnimation və CATransition istifadə olunur. Bütün bu siniflər CALayer xüsusiyyətlərinin açar yolları vasitəsilə işləyir ki, bu da demək olar ki, istənilən atributu — position-dan transform.rotation.z-dək animasiya etməyə imkan verir.
Apple bir neçe ixtisaslaşdırılmış CALayer alt sinfi təqdim edir, hər biri müəyyən bir tapşırığı həll edir. Əsas CALayer əvəzinə uyğun alt sinfi seçmək aparat sürətləndirməsi hesabına əhəmiyyətli performans artımı verə bilər.
CAReplicatorLayer kodun təkrarlanması olmadan təkrarlanan nümunələr yaratmaq üçün xüsusilə faydalıdır. Məsələn, 10 nöqtədən ibarət yükləmə göstəricisi instanceCount = 10 və instanceDelay animasiya vaxtı ofseti ilə bir CAReplicatorLayer ilə həyata keçirilir.
CALayer render edilməsi üç mərhələdən keçir. Commit — təbəqənin xüsusiyyəti dəyişdirildikdə CPU-da dəyişikliklər paketi formalaşdırılır. Render — Core Animation təbəqənin xüsusiyyətlərinə əsasən CPU-da Metal əmrləri yaradır. Composite — GPU əmrləri yerinə yetirir və kadrı ekrana çıxarır. Bütün proses displeyin yenilənmə tezliyi ilə sinxronlaşdırılır.
Bir neçe təbəqənin kompozisiyası zamanı GPU onları şəffaflıq, maskalar və qarışdırma rejimləri nəzərə alınmaqla yekun təsviirdə birləşdirir. Əgər təbəqənin opaque = true dəyəri varsa, Core Animation kompozisiyanı optimallaşdırır: alfa qarışdırması əvəzinə sadəcə piksel dəyişdirməsi aparılır ki, bu da çox daha sürətlidir.
Apple Performance Guidelines-yə görə, CALayer renderini yavaşdan əsas amillər: mürəkkəb sublayers iyerarxiyası (ekranda 30-dan çox təbəqə), maskaların istifadəsi (mask xüsusiyyəti), shadowPath olmadan avtomatik kölgə hesablanması, dinamik təbəqələr üçün shouldRasterize-in həddindən artıq istifadəsi.
XCode-da Core Animation Instrument aləti hər təbəqənin render vaxtını, offscreen buferlərinin sayını və drawRect çağırılma tezliyini izləməyə imkan verir. 60 FPS üçün optimal render vaxtı CPU-da 8 ms və GPU-da 8 ms-dən çox olmamalıdır.
Offscreen rendering — təbəqənin ekrana çıxarmazdan əvvəl aralıq buferdə render edilməsi. Məzmun ilə cornerRadius + masksToBounds istifadəsi, qrup opacity, maskalar və shouldRasterize zamanı baş verir. Hər offscreen keçidi 2–5 ms çəkir, ona görə də həddindən artıq offscreen render performans üçün kritikdir.
Offscreen rendering diaqnostikası üçün Core Animation Instrument-də Color Offscreen-Rendered alətindən istifadə edin. Sarı təbəqələr — offscreen, mavi olanlar — birbaşa ekran renderidir. Offscreen keçidlərinin minimuma endirilməsi iOS-da əsas optimallaşdırma texnikasıdır.
Birinci nümunə kölgə yaratma, küncləri yuvarlaqlışdırma və haşiyə ilə CALayer-in əsas konfiqurasiyasını göstərir. shadowPath renderi sürətləndirmək üçün açıq şəkildə təyin edilmişdir:
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
}
Ikinci nümunə — perspektiv 3D transformasiya ilə CABasicAnimation vasitəsilə transform animasiyası. Y oxu ətrafında fırlanma animasiyası kartın çevrilmə effektini yaradır:
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")
Uçüncü nümunə — fon gradienti yaratmaq üçün CAGradientLayer istifadəsi. Gradient GPU-da render edilir və ölçülər dəyişdirilərkən əlavə resurs tələb etmir:
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)
}
Tez-tez verilən suallar
UIView — CALayer üzərində toxunma emalı, Auto Layout və UIViewController ilə inteqrasiya əlavə edən əlavədir. CALayer yalnız vizual təqdimat və animasiya ilə işləyir, bu da onu sırf qrafik tapşırıqlar üçün daha yünül və səmərəli edir.
40-dan çox xüsusiyyət, o cümlədən position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth və borderColor. Animasiya UIView.animate animasiya bloku daxilində xüsusiyyət dəyişdirildikdə avtomatik başlayır.
shadowPath — UIBezierPath şəklində açıq kölgə konturu təyin edin. ShadowPath olmadan Core Animation kölgənin formasını hesablamaq üçün məzmunun alfa kanalını təhlil edir ki, bu da əlavə keçid tələb edir. ShadowPath ilə kölgə məzmun təhlili olmadan sadəcə həndəsi fiqur kimi render edilir.
Implicit animation — UIView.animate blokundan kənarda CALayer-in animasiya edilə bilən xüsusiyyəti dəyişdirildikdə avtomatik animasiyadır. Default müddət — 0.25 saniyə. CATransaction.setDisableActions(true) vasitəsilə söndürülə və ya CATransaction.begin/commit vasitəsilə öz müddəti təyin edilə bilər.
CAShapeLayer vektor formasını — xətt, dairə, çoxbucaqlı, mürəkkəb kontur göstərmək lazım olduqda daha səmərəlidir. O, ayrıca raster bufer yaratmadan GPU-da yolu render edir. Əsas CALayer fon, haşiyə və kölgə ilə düzbucaqı sahələr üçün uyğundur.
Yekun
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun