CALayer — کلاس پایه لایههای گرافیک در iOS است که بخشی از چارچوب QuartzCore میباشد. هر UIView در iOS یک CALayer مرتبط دارد که رندر محتوا، انیمیشن و ترکیب روی GPU را تامین میکند. به استناد به Apple QuartzCore Documentation, 2025، CALayer از بیش از 40 ویژگی قابل انیمیشن پشتیبانی میکند و مستقیماً از طریق Metal کار میکند. درک CALayer برای ایجاد انیمیشنهای روان و بهینهسازی عملکرد اینترفیس ضروری است.
نکات کلیدی
CALayer — کلاسی از چارچوب QuartzCore است که تصویر راستر یک ناحیه مستطیل از صفحه نمایش را مدیریت میکند. آن ویژگیهای دیداری را ذخیره میکند: frame, backgroundColor, opacity, shadow, border, transform. بر خلاف UIView، CALayer رویدادهای لمسی را پردازش نمیکند، در Auto Layout شرکت نمیکند و چرخه عمر view controller ندارد.
از نظر معماری، CALayer الگوی Model را در زمینه Core Animation پیاده سازی میکند. لایه وضعیت ویژگیهای دیداری را ذخیره میکند و Core Animation استفرای بین وضعیتها در طول انیمیشن را مدیریت میکند. این جداسازی امکان انیمیشن هر ویژگی لایه را بدون نیاز به ترسیم مجدد محتوا از طریق drawRect فراهم میکند.
به استناد به Apple WWDC 2024، CALayer برای کار از طریق Metal بازنویسی شده است. پایپلاین رندر مدرن شامل سه مرحله است: Commit (بهروزرسانی ویژگیها روی CPU)، Render (تولید دستورات GPU روی CPU) و Composite (اجرای دستورات روی GPU). CALayer در هر سه مرحله شرکت میکند و برای هر کدام داده تامین میکند.
هر لایه میتواند شامل sublayers — لایههای فرزند که بالای لایه والد رندر میشوند — باشد. سلسلهمراتب لایهها سلسلهمراتب UIView را تکرار میکند، اما میتواند به صورت جداگانه وجود داشته باشد. توسعهدهنده میتواند لایههایی مستقل از UIView از طریق CALayer() ایجاد کرده و آنها را از طریق addSublayer به سلسلهمراتب اضافه کند.
UIView — لایهای است بر روی CALayer که امکانات زیر را اضافه میکند: پردازش لمس از طریق UIResponder، شرکت در Auto Layout، نمایش در storyboard، یکپارچگی با UIViewController. CALayer — یک شیء سبک است که میتوان آن را بدون UIView برای عناصر صرفاً دیداری استفاده کرد.
در عمل، این به آن معنی است که اگر عنصری به لمس و چیدمان نیاز نداشته باشد، میتوان آن را به عنوان CALayer پیاده سازی کرد. به عنوان مثال، انیمیشنهای پسزمینه، نشانگرهای بارگیری، عناصر تزئینی — همه آنها با پیادهسازی از طریق CALayer و اجتناب از سرریست UIView موثرتر هستند.
ویژگیهای پایه CALayer شامل قاب، موقعیتیابی، نمایش و افکتهای دیداری میشود. frame ناحیه مستطیل لایه را در مختصات والد، bounds — مختصات داخلی، position — مرکز لایه را مشخص میکند. تغییر position به صورت پیشفرض از طریق implicit animation انیمیته میشود.
ویژگی contents به شما اجازه میدهد محتوای راستر لایه را مستقیماً تعیین کنید — از طریق CGImage یا CIImage. این یک التباطیو برای رسم از طریق drawRect است: اگر تصویر از قبل آماده است، میتوان آن را به contents ارسال کرد و Core Animation آن را بدون پردازش اضافی رندر خواهد کرد.
برای انیمیشن از CABasicAnimation، CAKeyframeAnimation و CATransition استفاده میشود. همه این کلاسها از طریق مسیرهای کلیدی ویژگیهای CALayer کار میکنند که تقریباً هر ویژگی را — از position تا transform.rotation.z — قابل انیمیشن میکند.
Apple چندین زیرکلاس تخصصی CALayer را ارائه میدهد که هر کدام مسئله مشخصی را حل میکنند. انتخاب زیرکلاس مناسب به جای CALayer پایه میتواند به لطف شتابدهی سختافزاری بهبود قابل توجهی در عملکرد ایجاد کند.
CAReplicatorLayer به ویژه برای ایجاد الگوهای تکرارشونده بدون دوبارهنویسی کد مفید است. به عنوان مثال، نشانگر بارگیری از 10 نقطه با یک CAReplicatorLayer با instanceCount = 10 و جابجایی زمان انیمیشن instanceDelay پیاده سازی میشود.
رندر CALayer در سه فاز انجام میشود. Commit — با تغییر ویژگی لایه روی CPU، بسته تغییرات شکل میگیرد. Render — Core Animation بر اساس ویژگیهای لایه دستورات Metal را روی CPU تولید میکند. Composite — GPU دستورات را اجرا و کادر را روی صفحه نمایش میدهد. تمام فرآیند با نرخ تازهسازی نمایشگر همگام میشود.
در ترکیب چند لایه، GPU آنها را در یک تصویر نهایی با حساب شفافیت، ماسکها و حالات ادغام ادغام میکند. اگر لایه opaque = true داشته باشد، Core Animation ترکیب را بهینه میکند: به جای ادغام آلفا، جایگزینی ساده پیکسل انجام میشود که بسیار سریعتر است.
به استناد به Apple Performance Guidelines، عوامل اصلی کندکننده رندر CALayer: سلسلهمراتب پیچیده sublayers (بیش از 30 لایه روی صفحه)، استفاده از ماسکها (ویژگی mask)، محاسبه خودکار سایه بدون shadowPath، استفاده از حد زیاد shouldRasterize برای لایههای پویا.
ابزار Core Animation Instrument در XCode به شما امکان میدهد زمان رندر هر لایه، تعداد بافرهای offscreen و دفعات فراخوانی drawRect را نظارت کنید. زمان رندر بهینه برای 60 FPS — حداکثر 8 ms روی CPU و 8 ms روی GPU.
رندر Offscreen — رندر لایه در یک بافر واسطی قبل از نمایش روی صفحه. در زمان استفاده از cornerRadius + masksToBounds با محتوا، opacity گروهی، ماسکها و shouldRasterize اتفاق میافتد. هر گذر offscreen 2–5 ms طول میکشد، بنابراین رندرهای افزایشی offscreen برای عملکرد حیاتی هستند.
برای تشخیص رندر offscreen از ابزار Color Offscreen-Rendered در Core Animation Instrument استفاده کنید. لایههای زرد — offscreen، آبی — رندر مستقیم روی صفحه. کاهش گذرهای offscreen تکنیک کلیدی بهینهسازی در iOS است.
نمونه اول تنظیمات پایه CALayer را با ایجاد سایه، گردکندگی گوشهها و مرز نمایش میدهد. shadowPath برای سرعت بخشی رندر به صورت صریح تعیین شده است:
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
}
نمونه دوم — انیمیشن transform از طریق CABasicAnimation با تبدیل یک 3D پرسپکتیو. انیمیشن چرخش در محور Y افکت چرخیدن کارت را ایجاد میکند:
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")
نمونه سوم — استفاده از CAGradientLayer برای ایجاد گرادیان پسزمینه. گرادیان روی GPU رندر میشود و هنگام تغییر اندازه به منابع اضافی نیاز ندارد:
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)
}
سوالات متداول
UIView — یک لایه بر روی CALayer است که پردازش لمس، Auto Layout و یکپارچگی با UIViewController را اضافه میکند. CALayer تنها با نمایش دیداری و انیمیشن کار میکند که آن را برای وظایف صرفاً گرافیک سبکتر و کارآمدتر میکند.
بیش از 40 ویژگی، از جمله position، bounds، frame، opacity، backgroundColor، cornerRadius، transform، shadowOffset، shadowRadius، borderWidth و borderColor. انیمیشن به صورت خودکار با تغییر ویژگی در داخل بلوک انیمیشن UIView.animate آغاز میشود.
shadowPath — یک کنتور صریح سایه به صورت UIBezierPath تعیین کنید. بدون shadowPath، Core Animation کانال آلفای محتوا را برای محاسبه شکل سایه تحلیل میکند که نیازمند یک گذر اضافی است. با shadowPath، سایه بدون تحلیل محتوا به عنوان یک شکل هندسی ساده رندر میشود.
Implicit animation — انیمیشن خودکار با تغییر ویژگی قابل انیمیشن CALayer در خارج از بلوک UIView.animate. مدت زمان پیشفرض — 0.25 ثانیه. میتوان آن را از طریق CATransaction.setDisableActions(true) غیرفعال کرد یا از طریق CATransaction.begin/commit مدت زمان خود را تعیین کرد.
CAShapeLayer زمانی کارآمدتر است که نیاز به نمایش یک شکل وکتوری — خط، دایره، چندضلعی، کنتور پیچیده داشته باشید. آن مسیر را روی GPU بدون ایجاد یک بافر راستر جداگانه رندر میکند. CALayer پایه برای نواحی مستطیل با پسزمینه، مرز و سایه مناسب است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید