CALayer là lớp cơ sở cho các layer đồ họa trong iOS, một phần của framework QuartzCore. Mỗi UIView trong iOS có một CALayer liên kết xử lý kết xuất nội dung, hoạt ảnh và tổng hợp trên GPU. Theo Apple QuartzCore Documentation, 2025, CALayer hỗ trợ hơn 40 thuộc tính có thể tạo hoạt ảnh và hoạt động trực tiếp thông qua Metal. Hiểu về CALayer là cần thiết để tạo hoạt ảnh mượt mà và tối ưu hiệu suất giao diện.
Điểm chính
CALayer là một lớp từ framework QuartzCore quản lý hình ảnh bitmap của một vùng hình chữ nhật trên màn hình. Nó lưu trữ các thuộc tính trực quan: frame, backgroundColor, opacity, shadow, border, transform. Không giống như UIView, CALayer không xử lý sự kiện chạm, không tham gia Auto Layout và không có vòng đời view controller.
Về mặt kiến trúc, CALayer triển khai mẫu Model trong bối cảnh Core Animation. Layer lưu trữ trạng thái của các thuộc tính trực quan, trong khi Core Animation quản lý việc nội suy giữa các trạng thái trong quá trình tạo hoạt ảnh. Sự tách biệt này cho phép tạo hoạt ảnh cho bất kỳ thuộc tính layer nào mà không cần vẽ lại nội dung thông qua drawRect.
Theo Apple WWDC 2024, CALayer đã được viết lại để hoạt động thông qua Metal. Đường ống kết xuất hiện đại bao gồm ba giai đoạn: Commit (cập nhật thuộc tính trên CPU), Render (tạo lệnh GPU trên CPU) và Composite (thực thi lệnh trên GPU). CALayer tham gia vào cả ba giai đoạn, cung cấp dữ liệu cho mỗi giai đoạn.
Mỗi layer có thể chứa sublayers — các layer con kết xuất trên layer cha. Hệ thống phân cấp layer phản ánh hệ thống phân cấp UIView nhưng có thể tồn tại độc lập với nó. Nhà phát triển có thể tạo layer độc lập với UIView thông qua CALayer() và thêm chúng vào hệ thống phân cấp qua addSublayer.
UIView là một wrapper bao quanh CALayer bổ sung: xử lý chạm qua UIResponder, tham gia Auto Layout, biểu diễn trong storyboard và tích hợp với UIViewController. CALayer là một đối tượng nhẹ có thể được sử dụng mà không cần UIView cho các phần tử trực quan thuần túy.
Trong thực tế, điều này có nghĩa là nếu một phần tử không cần xử lý chạm hoặc bố cục, nó có thể được triển khai dưới dạng CALayer. Ví dụ, hoạt ảnh nền, chỉ báo tải, phần tử trang trí — tất cả đều được triển khai hiệu quả hơn qua CALayer, tránh chi phí của UIView.
Các thuộc tính cơ bản của CALayer bao gồm khung, định vị, hiển thị và hiệu ứng trực quan. frame xác định vùng hình chữ nhật của layer trong tọa độ cha, bounds xác định tọa độ nội bộ và position xác định tâm của layer. Thay đổi position được tạo hoạt ảnh theo mặc định thông qua hoạt ảnh ngầm định.
Thuộc tính contents cho phép đặt nội dung bitmap trực tiếp — qua CGImage hoặc CIImage. Đây là một giải pháp thay thế cho việc vẽ qua drawRect: nếu hình ảnh đã sẵn sàng, nó có thể được truyền cho contents và Core Animation sẽ kết xuất nó mà không cần xử lý thêm.
Để tạo hoạt ảnh, CABasicAnimation, CAKeyframeAnimation và CATransition được sử dụng. Tất cả các lớp này hoạt động thông qua key path thuộc tính của CALayer, cho phép tạo hoạt ảnh cho hầu hết mọi thuộc tính — từ position đến transform.rotation.z.
Apple cung cấp một số lớp con chuyên biệt của CALayer, mỗi lớp giải quyết một tác vụ cụ thể. Chọn lớp con phù hợp thay vì CALayer cơ sở có thể mang lại cải thiện hiệu suất đáng kể nhờ tăng tốc phần cứng.
CAReplicatorLayer đặc biệt hữu ích để tạo các mẫu lặp lại mà không trùng lặp mã. Ví dụ, một chỉ báo tải với 10 chấm được triển khai với một CAReplicatorLayer sử dụng instanceCount = 10 và độ lệch thời gian hoạt ảnh instanceDelay.
Kết xuất CALayer diễn ra trong ba giai đoạn. Commit — khi một thuộc tính layer thay đổi, một lô thay đổi được hình thành trên CPU. Render — Core Animation tạo lệnh Metal trên CPU dựa trên các thuộc tính của layer. Composite — GPU thực thi lệnh và xuất khung hình ra màn hình. Toàn bộ quá trình được đồng bộ hóa với tốc độ làm mới màn hình.
Trong quá trình tổng hợp nhiều layer, GPU hợp nhất chúng thành hình ảnh cuối cùng có tính đến độ trong suốt, mặt nạ và chế độ hòa trộn. Nếu một layer có opaque = true, Core Animation tối ưu hóa tổng hợp: thay vì pha trộn alpha, việc thay thế pixel đơn giản được thực hiện, nhanh hơn đáng kể.
Theo Apple Performance Guidelines, các yếu tố chính làm chậm kết xuất CALayer là: hệ thống phân cấp sublayer phức tạp (hơn 30 layer trên màn hình), sử dụng mặt nạ (thuộc tính mask), tính toán bóng tự động không có shadowPath và sử dụng quá mức shouldRasterize cho các layer động.
Core Animation Instrument trong XCode cho phép giám sát thời gian kết xuất của mỗi layer, số lượng bộ đệm offscreen và tần suất gọi drawRect. Thời gian kết xuất tối ưu cho 60 FPS không quá 8 ms trên CPU và 8 ms trên GPU.
Kết xuất offscreen — kết xuất layer vào bộ đệm trung gian trước khi hiển thị trên màn hình. Xảy ra khi sử dụng cornerRadius + masksToBounds với nội dung, độ trong suốt nhóm, mặt nạ và shouldRasterize. Mỗi lượt offscreen mất 2–5 ms, vì vậy kết xuất offscreen quá mức rất quan trọng đối với hiệu suất.
Để chẩn đoán kết xuất offscreen, hãy sử dụng công cụ Color Offscreen-Rendered trong Core Animation Instrument. Layer màu vàng — offscreen, màu xanh lam — kết xuất trực tiếp ra màn hình. Giảm thiểu các lượt offscreen là một kỹ thuật tối ưu hóa chính trong iOS.
Ví dụ đầu tiên minh họa thiết lập CALayer cơ bản với tạo bóng, làm tròn góc và viền. shadowPath được chỉ định rõ ràng để tăng tốc kết xuất:
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
}
Ví dụ thứ hai hiển thị hoạt ảnh transform thông qua CABasicAnimation với biến đổi 3D phối cảnh. Hoạt ảnh xoay trục Y tạo hiệu ứng lật thẻ:
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")
Ví dụ thứ ba minh họa việc sử dụng CAGradientLayer để tạo gradient nền. Gradient kết xuất trên GPU và không yêu cầu tài nguyên bổ sung khi thay đổi kích thước:
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)
}
Câu hỏi thường gặp
UIView là một wrapper bao quanh CALayer bổ sung xử lý chạm, Auto Layout và tích hợp với UIViewController. CALayer chỉ làm việc với biểu diễn trực quan và hoạt ảnh, khiến nó nhẹ hơn và hiệu quả hơn cho các tác vụ đồ họa thuần túy.
Hơn 40 thuộc tính, bao gồm position, bounds, frame, opacity, backgroundColor, cornerRadius, transform, shadowOffset, shadowRadius, borderWidth và borderColor. Hoạt ảnh tự động bắt đầu khi thay đổi thuộc tính trong khối hoạt ảnh UIView.animate.
Đặt shadowPath — một đường viền bóng rõ ràng dưới dạng UIBezierPath. Không có shadowPath, Core Animation phân tích kênh alpha của nội dung để tính toán hình dạng bóng, yêu cầu một lượt bổ sung. Với shadowPath, bóng được kết xuất như một hình dạng hình học đơn giản mà không cần phân tích nội dung.
Hoạt ảnh ngầm định là hoạt ảnh tự động khi thay đổi thuộc tính có thể tạo hoạt ảnh của CALayer bên ngoài khối UIView.animate. Thời lượng mặc định là 0,25 giây. Có thể tắt qua CATransaction.setDisableActions(true) hoặc đặt thời lượng tùy chỉnh qua CATransaction.begin/commit.
CAShapeLayer hiệu quả hơn khi bạn cần hiển thị hình dạng vector — một đường thẳng, hình tròn, đa giác, đường dẫn phức tạp. Nó kết xuất đường dẫn trên GPU mà không tạo bộ đệm raster riêng. CALayer cơ sở phù hợp cho các vùng hình chữ nhật có nền, viền và bóng.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm