大多数浏览器和
Developer App 均支持流媒体播放。
-
充分利用 Apple Pencil 的强大功能
作为 iOS 18,iPadOS 18 和 visionOS 2 中的新功能,PencilKit 工具选择器现在支持自定属性,让用户能够选择完全自定的工具。了解如何利用同样出色的系统级工具选择体验,充分优化工具选择器带来的自定绘画体验。探索如何访问 Apple Pencil Pro 的新功能,包括侧旋角度、轻捏手势以及触觉反馈。
章节
- 0:00 - Introduction
- 1:16 - Configuring the tool picker
- 5:20 - Custom tools in the tool picker
- 8:47 - Apple Pencil Pro features and APIs
资源
- Apple Pencil
- Apple Pencil updates
- Configuring the PencilKit tool picker
- Forum: UI Frameworks
- Human Interface Guidelines: Apple Pencil and Scribble
- Playing haptic feedback in your app
相关视频
WWDC20
WWDC19
-
下载
大家好 我叫 Sam 是一名软件工程师 从事绘图功能的开发 在这个视频中 我将介绍 PencilKit 工具选择器和 Apple Pencil API 的改进功能 这些改进功能可以帮助你在 App 中 打造富有表现力的绘图体验 如果你想着手构建 丰富多彩的绘图体验 最简单的方法就是使用 PencilKit 而 PencilKit 工具选择器 可以帮你轻松整合 所有最新的平台功能 它在 iPad 上效果很棒 提供了响应灵敏的选择器 这个选择器可以灵活调整 以适应各种绘图和书写工作流程 在 iPhone 上 它会停靠在 可用的空间中 为用户提供各种工具和控件
而在 Apple Vision Pro 上 它会显示在悬浮于窗口外的 装饰元素中 现在 有了 Apple Pencil Pro 只需轻捏一下 就能在手部所在的位置 显示 PencilKit 工具选择器 首先 我将介绍 工具选择器的一些新功能 借助这些新功能 你可以进行配置 为你的 App 选择一套合适的工具 然后 我将展示如何直接在这个 工具选择器中构建自己的自定工具 最后 我将重点介绍一些用于 将绘图体验与 Apple Pencil Pro 整合的全新 API 首先演示一下工具选择器的新功能 我在画我家的两只猫咪 使用的是我正在开发的一款 App 使用这个 App 可在利用 PencilKit 绘制的笔画旁 添加动物形状的图章 这个视频的相关资源中 提供了这个项目的源代码 在我的 App 中 我提供了画笔 和橡皮擦等工具 还提供了动物工具 轻点动物工具可以调出 颜色、大小的控件 和一个自定形状选择器 当我更改这个工具的不同属性时 选择器中的项目会更新 以表示我选中了哪个项目
工具选择器深度支持轻捏手势等 Apple Pencil Pro 功能 而且无需编写额外代码 当我轻捏时 我的自定工具 会和 PencilKit 工具一起 显示在圆弧中 我要调整图章的属性 为我的每只猫咪添加完美的爪印
我的图章工具支持 Apple Pencil Pro 侧旋角度 因此我在放置爪印时 可以精确地进行旋转 很好! 现在 我可以直接在工具选择器中 轻点这个按钮 在画上签名!
从 iOS 13 开始 PKToolPicker 提供了使用全套 PencilKit 工具 轻松进行初始化的方法 欢迎观看“PencilKit 简介”视频 进一步了解 如何将 PKToolPicker 添加到你的 App 作为 iPadOS 18 和 visionOS 2 中的一项新功能 工具选择器现在 让你能够定义可用的工具 你可以将工具选择器 与 PKCanvasView、 你自己的绘图画布 或这两者的组合搭配使用!
当使用书写工具来提供 用于在 PKCanvasView 上 绘制笔画的工具时 甚至可以添加 属于同一类型的多个工具! 例如 这些功能非常适合用于 在提供注解体验的 App 中 显示两种颜色的钢笔 或是两种颜色的记号笔 PKToolPickerItem 有许多类型 能够为你的选择器提供 所需的任何项目 使用全新 toolItems 构造器 可以自定适合你的 App 的 顺序和工具套组! 书写工具、橡皮擦和套索工具项 都有相应的 PKTool PencilKit 会使用这些工具 在它的画布上绘制内容 如果将画布视图设置为 工具选择器的观察器 则这些工具会自动设置为 PKCanvasView 的工具属性 标尺不同于其他项目 轻点标尺后 它会切换为打开或关闭 而不是变为选中状态 这个标尺项目没有匹配的 PKTool 因为它不会在画布上绘制任何内容 轻点这个项目后 设为观察器的 PKCanvasView 会自动切换 isRulerActive 属性
你也可以使用工具选择器观察器 来切换自定画布的标尺
“随手写”功能非常适合用于 自动将 Apple Pencil 手写内容 转换为文本
将“随手写”项目添加到选择器中 就可以集中一处提供 “随手写”和绘图功能 便于切换 Apple Pencil 模式 选中“随手写”工具后 它会将颜色池 替换成键盘快捷键栏中的控件 根据 Apple Pencil 设置中 启用“随手写”的偏好设置 “随手写”工具可以自动隐藏 请观看 “了解 iPad 的随手写功能”视频 进一步了解如何在 App 中 设置“随手写”功能 自定项目让 PKToolPicker 能够支持 你能想到的任何非 PencilKit 工具! 例如 这是我之前展示的图章工具 但是你也可以将这个工具替换成 你的 App 提供的任何功能! 我要详细介绍一下自定项目 作为 iPadOS 18 和 visionOS 2 中的新功能 PKToolPicker 允许在后缘设置 配件 UIBarButtonItem 使用这个按钮可显示 并非绘图工具的画布操作 比如插入文本框或设置背景 在这里提供的操作 也应该在 App UI 的 其他位置提供 因为当选择器处于最小化状态时 这个按钮会隐藏起来 接下来 我将介绍 如何从你的绘图画布 将工具构建到工具选择器中 PKToolPicker 一直最适合用于挑选 与 PKCanvasView 搭配使用的工具 现在 借助自定工具 你可以将工具选择器 与你的绘图工具搭配使用
PKToolPicker 可以 与 PKCanvasView、 你自己的绘图画布 或两者的组合搭配使用
自定工具非常适合用于 将系统 Apple Pencil 工具 与你的画布独有的操作整合 比如添加动物图章 也可与通过绘图功能控制的 照片美化工具整合
选择自定工具项目后 在任何 设为观察器的 PKCanvasView 上 绘图功能都处于关闭状态 对于自定工具 你的 App 会负责进行渲染 而 PencilKit 负责选择工具
PKToolPickerCustomItem 和相应的 Configuration 让你能够自行构建 适合自己工具功能的项目 你可以使用 Configuration 结构体 来定义工具支持的属性 PencilKit 提供了控件 让你可以根据工具的行为 来配置颜色和宽度属性 要控制其他属性 需要传递视图控制器 以显示更多控制项 PencilKit 会使用你在闭包中 提供的预先渲染的图像 在选择器中显示你的自定工具项目
每当宽度、颜色或不透明度 发生变化时 PencilKit 就会 为新的图像调用这个闭包 当自定属性发生变化时 你还应该调用 reloadImage 方法 考虑一下如何在工具图像中 表示工具的属性 UILabel.drawText(in:) 非常适合用于绘制 工具上的文本指示器 比如用于表示不透明度值 最后 我将展示如何 在你的 App 中充分发挥 Apple Pencil Pro 的强大功能 Apple Pencil Pro 提供了 大量新功能 可以帮助你进一步提升 App 的绘图体验! 我在“备忘录”中 制定了“Salsa Garden”计划 现在我想快速更改一些内容 要挑选理想的工具来为 “CILANTRO”标签添加下划线 我只需轻捏 Apple Pencil Pro 即可在我悬停的位置 显示工具选择器 先更改钢笔工具的颜色 然后绘制下划线
效果不太好 我要撤销操作 然后换用高亮显示效果 轻捏 Apple Pencil Pro 然后长按撤销按钮 调出一个滑块 现在 只需滑动即可撤销多项操作
再次轻捏 切换到记号笔工具 Apple Pencil 让用户能够 轻松利用不同的动作 来绘制富有表现力的笔画 这些动作包括改变高度、方位角 以及应用不同的力度
现在 有了 Apple Pencil Pro 侧旋功能可以进一步提升创作体验
如果你的 App 使用 PKCanvasView 那么记号笔和钢笔 都会支持这项功能 使用 Apple Pencil Pro 时 可以通过侧旋来控制笔画的角度! 使用所有 PencilKit 工具时 Apple Pencil Pro 的悬停位置下方 会显示漂亮的阴影 代表特定的工具 我要使用记号笔工具 来高亮显示“CILANTRO”标签 在笔画的末尾暂停 以触发形状识别 触发后 我可以通过手部的触觉反馈 确认识别成功 这种吸附功能让整个体验 瞬间生动起来! “备忘录”App 利用 PencilKit 实现了这种深度整合 但除此之外 还有丰富的 API 可以与你自己的自定绘图画布整合 首先 我将介绍新的撤销滑块 作为 Apple Pencil Pro 的新功能 轻捏手势可用于调出一个滑块 来快速浏览撤销/重做历史记录 这项功能适用于所有 App 即使不使用 PKToolPicker 也可以使用这项功能 如果想要禁止这项操作 可以通过委托来 安装 UIPencilInteraction 实现这个方法以响应轻捏操作 对于提供绘图功能的 App 轻捏手势开辟了全新的可能性 让用户无需松开 Apple Pencil 即可与你的 App 进行交互
将轻捏作为执行独立操作的单一手势 能让你的 App 带给用户 更舒适的使用体验 通过一项设备全局偏好设置 你可以设置 App 应该如何响应 轻捏 Apple Pencil Pro 的操作 其中包括一些新增选项 例如显示关联工具盘 或运行系统快捷指令
请注意 如果将这项偏好设置 设为运行快捷指令 则轻捏事件不会发送到你的 App 现在 在支持的设备上向 App 发送轻点两下或轻捏事件时 UIPencilInteraction 也会发送 Apple Pencil 悬停位姿信息 位姿描述了 Apple Pencil 在显示屏上方的放置方式 包括在屏幕上方的位置、 到屏幕的 Z 轴偏移 以及方位角、仰角和侧旋角度 PencilKit 会根据这些位姿信息 在接收到相应的轻捏操作时 确定显示 PKToolPicker 的位置 你也可以在自己的工具选择器中 使用这些信息 这里的代码可以完成这项操作 我要实现委托方法 以接收轻捏事件 检查用户是否希望 在轻捏时显示工具盘 轻捏结束后 如果悬停位置可用 就会将悬停位置发送到工具盘显示 除了 UIPencilInteraction 的更新之外 还有全新的 SwiftUI API 用于与 Apple Pencil 交互 这是 SwiftUI 中的同一个示例 使用了 onPencilSqueeze 修饰符 我会检查偏好设置、所处阶段 如果悬停位置可用 我还会获取悬停位置 你可以在工具选择器中 采用这些 API 以便与你在“设置”中 做出的选择保持一致 也可以使用 PKToolPicker 实现所有这些操作 而无需编写任何额外代码 Apple Pencil Pro 使用现有的 SwiftUI 和 UIKit 反馈 API 提供触觉反馈 这些 API 已经在 许多地方得到应用 比如用于在控件状态 发生变化时提供反馈
反馈 API 经过调优 能够根据平台特征 和设置等因素 在不同场景中 提供不同类型的反馈 例如 可以单独提供触觉或音频反馈 也可以两者都提供或都不提供
SwiftUI 和 UIKit 中都提供了 新的反馈 API 用于对齐吸附和完成路径
这些 API 现在可以利用位置 来获得更多背景信息 以确定最适合给定事件的反馈方式 这个示例说明了如何使用新的 UICanvasFeedbackGenerator 类 当自定画布吸附到布局参考线时 我会告诉反馈生成器发生了对齐 当触发自定形状识别逻辑 将绘制的笔画吸附到 简洁规则的形状时 我会告诉反馈生成器 完成了一条路径 UIFeedbackGenerator 和它的所有子类都进行了更新 从而在生成反馈时 使用初始化视图 和这个视图中的一个点 对于视图 请选择 接近要生成的反馈的视图 比如画布视图 请务必更新 UIFeedbackGenerator 的所有用例 这将有助于 UIKit 提供 最适合你的 App 的反馈 除了 UICanvasFeedbackGenerator SwiftUI 还在 SensoryFeedback 结构体中 提供了 alignment 和 pathComplete 这里有两个 State 整数 它们会在与参考线对齐时 以及绘制的笔画吸附到形状时递增 我已经针对这些运算 将 sensoryFeedback 修饰符 添加到我的画布上的特定视图中 这样一来 每当触发器的值 发生变化时 就会请求反馈 采用 SwiftUI 中的 SensoryFeedback 或是 UIKit 中的 UICanvasFeedbackGenerator 就能发挥 Apple Pencil Pro 的优势 让自定画布变得生动鲜活 请查看 Apple 开发者文档中的 “在你的 App 中 玩转触觉反馈”一文 了解更多详细信息 侧旋角度能让笔画变得更具表现力 应该将侧旋角度用于 提供绘制笔画输入 而不是用于控制用户界面元素 利用侧旋位置 可以 让自定笔画响应更灵敏
理想之选是让笔画模仿 带有成角度尖端的真实工具 随着手上的侧旋动作而变化
添加侧旋角和方位角 可以更好地响应不同的动作 此外 为了在不支持侧旋的设备上 提供备用方案 UITouch 和 UIHoverGestureRecognizer 上 都提供了 rollAngle 这有助于提升自定工具的悬停体验 就像我之前展示的动物图章预览一样 接收手指触控操作时 要想实现笔画的变化 方向和速度是很不错的 备用方案 侧旋通过蓝牙发送 首次发送时 会进行估算 随后会进行更新 请务必实现 touchesEstimatedPropertiesUpdated 以获得最准确的笔画最终值 也请查看最新版《人机界面指南》 了解实现所有 Apple Pencil 功能的最佳实践 以上就是 Apple Pencil 的新增功能! 那么 接下来该怎么做? 采用 PKToolPicker 来提供工具选择体验 进行深度系统集成并减少代码量 将自定工具添加到 PKToolPicker 从而在提供 PencilKit 工具 的同时一并提供自定工具 还要借助可用于 与 Apple Pencil Pro 整合的 丰富多样的 API 来提升自定绘图体验 要想开始行动并充分利用 Apple Pencil 的强大功能 要做的就是这些! 谢谢观看!
-
-
10:24 - Respond to squeeze in UIKit
class MyViewController: UIViewController, UIPencilInteractionDelegate { func pencilInteraction(_ interaction: UIPencilInteraction, didReceiveSqueeze squeeze: UIPencilInteraction.Squeeze) { if UIPencilInteraction.preferredSqueezeAction == .showContextualPalette && squeeze.phase == .ended { let anchorPoint = squeeze.hoverPose?.location ?? myDefaultLocation presentMyContextualPaletteAtPosition(anchorPoint) } } }
-
10:46 - Respond to squeeze in SwiftUI
@Environment(\.preferredPencilSqueezeAction) var preferredAction @State var contextualPalettePresented = false @State var contextualPaletteAnchor = MyPaletteAnchor.default var body: some View { MyView() .onPencilSqueeze { phase in if preferredAction == .showContextualPalette, case let .ended(value) = phase { if let anchorPoint = value.hoverPose?.anchor { contextualPaletteAnchor = .point(anchorPoint) } contextualPalettePresented = true } } }
-
11:50 - Provide canvas feedback in UIKit
class MyViewController: UIViewController { @ViewLoading var feedbackGenerator: UICanvasFeedbackGenerator override func viewDidLoad() { super.viewDidLoad() feedbackGenerator = UICanvasFeedbackGenerator(view: view) } func dragAlignedToGuide(_ sender: MyDragGesture) { feedbackGenerator.alignmentOccurred(at: sender.location(in: view)) } func snappedToShape(_ sender: MyDrawGesture) { feedbackGenerator.pathCompleted(at: sender.location(in: view)) } }
-
12:29 - Provide canvas feedback in SwiftUI
@State var dragAlignedToGuide = 0 @State var snappedToShape = 0 var body: some View { MyView() .sensoryFeedback(.alignment, trigger: dragAlignedToGuide) .sensoryFeedback(.pathComplete, trigger: snappedToShape) }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。