WWDC Quick Look 💓 By SwiftGGTeam
What's new in PencilKit

What's new in PencilKit

观看原视频

Highlight

iOS 14 为 PencilKit 增加智能选择、插入空间、系统颜色选择器、全局手指绘图策略、独立 PKToolPicker 实例和 PKDrawing stroke 访问入口,开发者可以用 drawingPolicy 与 tool picker 状态控制 Apple Pencil 和手指输入。

核心内容

PencilKit 在 iOS 13 已经把低延迟绘图、Apple Pencil 压感和系统工具栏交给了 PKCanvasView。问题出在输入策略上:同一个画布里,手指有时应该绘图,有时应该滚动、选择或调整手写内容。开发者如果只靠旧的 allowsFingerDrawing,很难同时尊重用户的全局 Apple Pencil 偏好和 App 自己的模式切换。(04:03

iOS 14 先把一批体验升级放进系统层。已经接入 PencilKit 的 App 会自动获得更像文字编辑的手写选择、插入空间、新的 UIKit 颜色选择器,以及更好的延迟表现;PKCanvasView 也开始支持 Mac Catalyst,不过 Catalyst 上没有 tool picker,需要通过 canvas API 设置 ink。(01:21

开发者真正要迁移的,是输入策略和工具栏状态。PKCanvasViewDrawingPolicy 替代 allowsFingerDrawing,把“任何输入都画”“只允许 Pencil 画”“跟随默认策略”明确拆开。PKToolPicker 也从共享窗口实例走向独立实例,便于一个 App 同时拥有记笔记画布和涂色画布。(05:21

这场 session 最后把边界推到 PKDrawing 内部。iOS 14 让开发者能访问 strokes、inks、paths 和 points。10107 只点到这条路线,具体的读取、修改和构造绘图数据交给后续的 10148 继续展开。(09:08

详细内容

PencilKit 的系统级体验会继续演进

01:21)PencilKit 文档在 iOS 14 里获得了智能选择。用户可以双击选择一个词,再次双击选择一行,也可以用 grab handles 扩展选择范围。对于非连续内容,系统提供了 velocity-sensitive tap-and-pan 手势,用户可以像刷过笔画一样选择分散的 stroke。

01:51)插入空间解决的是手写笔记的常见问题:写完以后发现中间漏了一段。用户可以点空白区域,从 callout bar 选择 Insert Space,再拖动 handle 留出位置。这些能力由系统提供,已有 PencilKit 客户端不需要写额外代码。

02:23)PencilKit 还采用了新的 UIKit 系统颜色选择器。用户可以从 spectrum、sliders、custom colors 和 eye dropper 中选色。演讲明确把更多细节指向 10052 的 UIKit pickers session。

用 drawingPolicy 替代 allowsFingerDrawing

05:21allowsFingerDrawing 在 iOS 14 被新的 PKCanvasViewDrawingPolicy 取代。开发者不要直接改 drawing gesture recognizer 的 allowedTouchTypes,应该把输入意图写在 canvas 的 drawing policy 上。

var drawingPolicy: PKCanvasViewDrawingPolicy

关键点:

  • PKCanvasViewDrawingPolicy.anyInput 允许手指和 Apple Pencil 都绘图。
  • PKCanvasViewDrawingPolicy.pencilOnly 只允许 Apple Pencil 绘图,手指可以滚动或触发智能选择手势。
  • PKCanvasViewDrawingPolicy.default 会在 tool picker 可见时尊重用户通过设置或 tool picker 切换的 UIPencilInteraction.prefersPencilOnlyDrawing 状态。
  • tool picker 隐藏时,默认策略只让 Apple Pencil 绘图,手指负责滚动和选择。

控制 tool picker 里的 Draw With Finger 开关

07:06)如果 App 是纯 Pencil 绘图工具,画布设置成 pencilOnly 后,tool picker 里的 Draw With Finger 开关会造成误导。此时应该隐藏绘图策略控件。

PKToolPicker.showsDrawingPolicyControls

关键点:

  • iPad 上这个控件默认会显示 Draw With Finger 开关。
  • 当 canvas policy 固定为 pencilOnly 时,把 showsDrawingPolicyControls 设为 false,避免用户切换后画布行为没有变化。
  • 如果 App 希望尊重用户的全局 Apple Pencil 设置,就保留这个控件,并让 canvas 使用 .default

每个 canvas 可以维护自己的 PKToolPicker

08:40)iOS 14 更新了 PKToolPicker 的初始化方式。开发者可以创建多个独立 tool picker,每个实例都有自己的 drawing policy controls、selected tool 和其他状态。演讲用记笔记模式和涂色模式说明这个差异。

notesCanvas.drawingPolicy = .default
notesToolPicker.showsDrawingPolicyControls = true
notesToolPicker.selectedTool = PKInkingTool(.pen, color: .black, width: 2)

drawingCanvas.drawingPolicy = .anyInput
drawingToolPicker.showsDrawingPolicyControls = false
drawingToolPicker.selectedTool = PKInkingTool(.marker, color: .purple, width: 20)

关键点:

  • 记笔记 canvas 使用 .default,让用户通过系统偏好决定手指是否绘图。
  • 记笔记 tool picker 显示 drawing policy controls,用户能直接看到并切换 Draw With Finger。
  • 涂色 canvas 使用 .anyInput,因为这个模式明确允许手指和 Apple Pencil 都上色。
  • 涂色 tool picker 隐藏 drawing policy controls,避免出现与固定策略冲突的开关。
  • App 必须自己持有每个 PKToolPicker 实例,否则 picker 的状态和生命周期无法稳定维护。

Stroke 访问把 PencilKit 从画布推进到数据层

09:08)最后一个变化是 PKDrawing 内部数据开始开放。开发者可以访问 strokes,并进一步看到 ink、path、points 等信息。10107 没有展开完整代码,它把识别、动画、机器学习和绘图修改这些场景指向 10148。

这个边界很重要。以前采用 PencilKit 主要是在 App 里放一块高质量画布;iOS 14 之后,绘图数据可以进入 App 自己的业务逻辑,例如批注识别、笔画动画、形状修正和基于机器学习的手写内容分析。

核心启发

  • 做一个笔记与涂色并存的创作界面:同一个文档里放 notesCanvasdrawingCanvas,前者使用 .default 并显示 Draw With Finger,后者使用 .anyInput 并固定紫色 marker。这样用户在记笔记时保留滚动和选择,在涂色时可以用手指直接上色。
  • 做一个尊重系统 Apple Pencil 偏好的批注工具:让主批注 canvas 使用 .default,保留 tool picker 的 drawing policy controls。用户在系统设置或任意 PencilKit App 里切换 Prefer Only Pencil Drawing 后,你的 App 会跟随同一个偏好。
  • 做一个面向纯 Pencil 的专业绘图模式:把画布设为 pencilOnly,同时关闭 showsDrawingPolicyControls。手指用于滚动、选择和调整内容,Apple Pencil 负责产生笔画,适合草图、工程批注和长文档手写。
  • 为 Catalyst 版本保留基础绘图能力:在 Mac Catalyst 上使用 PKCanvasView 展示或编辑 PencilKit 内容,通过 canvas API 设置 ink。由于 tool picker 不支持 Catalyst,界面上要提供自己的工具选择入口。
  • 把 stroke 数据交给识别或动画流程:把 10107 当作入口,继续阅读 10148 的 PKStroke、ink、path 和 point 细节。适合做笔画回放、图形识别、批注分类或手写内容分析。

关联 Session

评论

GitHub Issues · utterances