Core Graphics如何对合并后的绘制调用结果整体应用alpha值
实现方案
不需要手动创建离屏上下文渲染独立图像,Core Graphics 原生提供了**透明度图层(Transparency Layer)**机制,专门用于实现分组绘制后统一应用透明度、阴影等效果的需求,系统会自动管理临时渲染缓冲区,代码更简洁。
实现逻辑
透明度图层会将beginTransparencyLayer和endTransparencyLayer之间的所有绘制操作,先在系统内部维护的临时上下文中完成全不透明合成,再将合成后的整体结果按照当前上下文的全局状态(包括alpha值、阴影等)绘制回原目标上下文,从根源上避免单次绘制逐个乘alpha导致的重叠区域叠加异常。
代码示例
var result = context.image { ctx in let cgContext = ctx.cgContext // 提前设置要应用到整组绘制结果的全局透明度 cgContext.setAlpha(0.5) // 开启透明度图层 cgContext.beginTransparencyLayer(auxiliaryInfo: nil) // 图层内正常执行全不透明绘制,不需要调整alpha UIColor(hue: 0.2, saturation: 1, brightness: 1, alpha: 1).setFill() let path1 = UIBezierPath(roundedRect: CGRect(x: 100, y: 100, width: 200, height: 200), cornerRadius: 10) let path2 = UIBezierPath(roundedRect: CGRect(x: 150, y: 150, width: 200, height: 200), cornerRadius: 10) path1.fill() path2.fill() // 结束图层,系统自动将合成后的整体内容按之前设置的alpha绘制回主上下文 cgContext.endTransparencyLayer() // 重置alpha避免影响后续其他绘制操作 cgContext.setAlpha(1) }
效果说明
- 原逐次fill前setAlpha的写法:两个矩形重叠区域会经过两次半透明叠加,颜色比非重叠区域更深
- 透明度图层写法:两个矩形先以全不透明状态合并为统一形状,再整体应用0.5透明度,所有区域颜色、透明度完全一致,和手动渲染为独立图像再绘制的最终效果完全相同。
注:
beginTransparencyLayer传入auxiliaryInfo: nil即可满足绝大多数场景需求,不需要额外配置参数。
内容的提问来源于stack exchange,提问作者johnbakers
相关产品推荐
相关产品推荐

