Swift中如何去除PencilKit Marker工具的默认颜色透明度
PencilKit 马克笔默认透明度移除方案
系统原生PKMarker工具的半透明效果是PencilKit框架内置的硬编码渲染特性,没有公开API可以直接一键关闭该默认效果,所有可行方案均通过绕开原生marker渲染逻辑、事后修正笔画属性实现,直接给原生marker工具设置color.withAlphaComponent(1.0)是无效的,系统会在渲染marker类型笔画时自动叠加固定透明度。
方案1:自定义无透明度仿马克笔工具(稳定性最高,推荐)
- 弃用系统内置的
.marker类型笔触,改用其他可控的笔刷类型模拟马克笔效果,从根源避开系统的透明渲染逻辑:// 选用.pen笔刷类型,调整宽度、触感参数模拟马克笔粗头效果,颜色alpha强制设为1.0 let opaqueMarkerTool = PKInkingTool( .pen, color: UIColor.black.withAlphaComponent(1.0), width: 28 ) - 如果需要还原马克笔的平头、叠加无变深的特性,可以通过
PKStroke自定义路径渲染逻辑,手动控制所有笔触的颜色alpha值恒为1,完全自主控制渲染效果。
方案2:遍历笔画修正透明度(iOS14+可用,改动量小)
- 利用PencilKit公开的笔画访问接口,在每次绘制结束后遍历画布所有笔画,将马克笔类型的笔画颜色强制改为不透明,再重新赋值给画布:
func removeMarkerAlpha(for drawing: PKDrawing) -> PKDrawing { var processedStrokes: [PKStroke] = [] for stroke in drawing.strokes { var newStroke = stroke if newStroke.ink.type == .marker { let rawColor = newStroke.ink.color // 强制将马克笔颜色透明度设为1.0 newStroke.ink = PKInk(.marker, color: rawColor.withAlphaComponent(1.0)) } processedStrokes.append(newStroke) } return PKDrawing(strokes: processedStrokes) } // 调用时机:监听canvasViewDrawingDidChange(_ canvasView: PKCanvasView)回调 func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) { // 加防抖避免绘制过程中频繁赋值卡顿 NSObject.cancelPreviousPerformRequests(withTarget: self) perform(#selector(updateOpaqueMarker), with: nil, afterDelay: 0.3) } @objc private func updateOpaqueMarker() { let processedDrawing = removeMarkerAlpha(for: canvasView.drawing) canvasView.drawing = processedDrawing } - 注意:该方案需要加防抖逻辑,避免绘制过程中频繁重绘导致卡顿。
方案3:自定义工具选择器
- 直接在
PKToolPicker中移除原生马克笔选项,替换为你自定义的无透明度仿马克笔工具,从选择入口避免用户触发原生带透明度的马克笔渲染逻辑,适合不需要完全对齐原生马克笔交互的场景。
内容的提问来源于stack exchange,提问作者Evan C
相关产品推荐
相关产品推荐

