如何在PencilKit与PKCanvasView中关闭深色模式自动调色?
解决PencilKit自动随明暗模式调色的正规方法
方案1:用固定颜色空间创建绘图工具
PencilKit自动调色的核心是默认会根据明暗模式动态调整笔迹颜色以保证可读性。要避免这种行为,需在创建PKInkingTool时使用不依赖系统动态颜色的固定色值:
- 不要用系统动态颜色(如
UIColor.label、UIColor.systemBlack),直接通过RGB值创建固定颜色并指定.extendedSRGB颜色空间:// 方法1:直接创建无动态适配的UIColor let fixedBlack = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0, dynamicProvider: nil) // 方法2:通过CGColor指定颜色空间 let srgbSpace = CGColorSpace(name: CGColorSpace.extendedSRGB)! let cgColor = CGColor(colorSpace: srgbSpace, components: [0.0, 0.0, 0.0, 1.0])! let fixedBlack = UIColor(cgColor: cgColor) // 使用固定颜色创建绘图工具 let inkTool = PKInkingTool(.pen, color: fixedBlack, width: 2.0) - 这类固定颜色不会随明暗模式变化,PencilKit也不会对其做反转处理。
方案2:配置PKCanvasView锁定界面风格
锁定PKCanvasView的界面风格并非临时方案,反而适合PDF/照片这类需要固定笔迹颜色的场景:
- 根据当前展示内容动态设置
overrideUserInterfaceStyle:// 显示PDF/照片时,固定为浅色风格(按需改为深色) canvasView.overrideUserInterfaceStyle = .light // 回到普通画布时,恢复跟随系统设置 canvasView.overrideUserInterfaceStyle = .unspecified - 这是官方支持的配置方式,能从根源上阻止PencilKit的自动调色逻辑。
方案3:手动修改已绘制笔迹的颜色
如果需要对已绘制的笔迹强制固定颜色,可直接修改PKDrawing的内容:
- 遍历所有笔迹并替换为固定颜色:
let updatedDrawing = canvasView.drawing.modifyingStrokes { stroke in guard let inkStroke = stroke as? PKInkStroke else { return stroke } let fixedColor = UIColor.black.cgColor let modifiedInk = PKInk(inkStroke.ink.type, color: fixedColor) return PKInkStroke(ink: modifiedInk, points: inkStroke.points) } canvasView.drawing = updatedDrawing - 可在明暗模式切换时触发这个逻辑,确保已有笔迹颜色不变。
PencilKit的自动调色是为了适配纯文本画布的可读性,在PDF/照片场景下,上述方法均为官方认可的正规实现方式。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

