CALayer 是 macOS 和 iOS 系统中负责 图形渲染、动画和视觉效果的核心类之一,来自 Apple 的 Core Animation 框架(全称 Core Animation Layer)。它是构建现代 UI 的底层核心组件。
为什么需要CALayer?
在没有 CALayer 的世界中,所有绘制都需要手动使用 draw(),性能低、动画难。而有了 CALayer:
1、图形内容由 GPU 加速绘制
2、提供属性动画(位移、旋转、缩放等)。。
3、支持视觉效果(阴影、圆角、透明度等)。
4、支持图层层级管理(Z 顺序)。
macOS中的CALayer
在 macOS 中,NSView 可以拥有一个 CALayer,但默认没有,需要手动启用:
view.wantsLayer = true
然后就可以访问:
view.layer?.backgroundColor = NSColor.red.cgColor
view.layer?.cornerRadius = 10
常见属性
1、backgroundColor:CGColor?类型,背景颜色。
2、cornerRadius:CGFloat类型,圆角半径。
3、borderWidth:CGFloat类型,边框宽度。
4、borderColor:CGColor?类型,边框颜色。
5、shadowColor:CGColor?类型,阴影颜色。
6、shadowOpacity:Float类型,阴影透明度。
7、shadowOffset:CGSize类型,阴影偏移。
8、shadowRadius:CGFloat类型,阴影模糊半径。
9、opacity:Float类型,透明度(0~1)。
10、transform:CATransform3D类型,三维变换(旋转/缩放等)。
11、contents:Any?类型,图像内容(CGImage, NSImage, CALayer 等)。
设置视图样式
在NSView视图中,将wantsLayer属性改为true后,可以使用CALayer的各种渲染属性。
let view = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.systemBlue.cgColor
view.layer?.cornerRadius = 10
view.layer?.borderWidth = 2
view.layer?.borderColor = NSColor.white.cgColor
view.layer?.shadowColor = NSColor.black.cgColor
view.layer?.shadowOpacity = 0.5
view.layer?.shadowOffset = CGSize(width: 4, height: -4)

CALayer 与 NSView 的区别
1、管理内容:NSView负责事件、布局、交互,CALayer负责渲染、动画、视觉效果。
2、子视图:NSView可以包含子视图,CALayer也可以包含子图层。
3、内容:NSView需要绘制内容,CALayer可显示图片、颜色、子图层。
4、线程:NSView线程绑定(主线程),CALayer相对轻量,可后台渲染。
CALayer 不是替代 NSView,而是NSView的底层绘图引擎和动画基础设施。
使用场景
1、修改背景颜色
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.red.cgColor
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
CATransaction.begin()
CATransaction.setAnimationDuration(1.0)
view.layer?.backgroundColor = NSColor.green.cgColor
CATransaction.commit()
}

总结
CALayer(Core Animation Layer),负责图形绘制、动画、视觉效果。
配合 NSView 或 UIView 使用,设置 view.wantsLayer = true 后启用。
优势为:高性能、GPU 加速、可动画、支持视觉特效。
相关文章
1、macOS视图NSView:https://fangjunyu.com/2025/07/01/macos%e8%a7%86%e5%9b%bensview/
2、macOS颜色NSColor:https://fangjunyu.com/2025/07/01/macos%e9%a2%9c%e8%89%b2nscolor/