View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 了解 PaperKit

    了解如何将 PaperKit 引入你的 iOS、iPadOS、macOS 以及 visionOS App。我们将介绍如何将 PencilKit 绘画与标记功能 (如形状和图像) 无缝整合,以及如何自定用户界面。了解向前兼容性的最佳实践,并探索高级自定选项,以便为你的 App 打造真正与众不同的标记体验。

    章节

    • 0:00 - 简介
    • 1:36 - 了解 PaperKit
    • 3:35 - PaperKit 入门
    • 8:37 - 自定功能集

    资源

    • PaperKit
      • 高清视频
      • 标清视频

    相关视频

    WWDC24

    • 充分利用 Apple Pencil 的强大功能

    WWDC20

    • PencilKit 的新功能
    • SwiftUI 新功能
  • 搜索此视频…

    欢迎大家 我叫 Andreea 是 Pencil & Paper 团队的工程师 很高兴为大家介绍 PaperKit PaperKit 在全系统范围内支持 Apple 独特标记体验的框架 它被应用于“备忘录”、“截屏”、 “快速查看”和“手记”等 App 中

    它是在各款 App 中 实现丰富标记的最简单方法 PaperKit 提供了一个画布 供你在上面绘画 并添加各种标记元素 包括形状、图像、文本框等 同时支持绘画 和标记元素 使得 PaperKit 成为各款 App 中 提供全面标记体验的绝佳补充

    作为 macOS Tahoe 的新增框架 PaperKit 提供了 相同的丰富标记体验 因此绘画和标记元素在任何 macOS App 上都可以出色地工作 正如这里展示的全新“手记”App

    首先 我会详细介绍 PaperKit 的主要功能 并解释它背后的核心组件

    然后我将通过几个步骤展示如何 将 PaperKit 标记集成到 App 中

    最后 我将说明如何 根据你的 App 的实际需求 定制 PaperKit 的标记体验

    我会先通过一个演示 来重点介绍可用的功能 我创建了一个 App 来记录我的所有食谱 并在进行修改时使用标记来更新它们 我从七岁起就开始 烘焙我最爱的传统罗马尼亚饼干 现在我把配方整理成了食谱 并用星形为它们评分 为了完善这份食谱 我将添加一张饼干的图片 只需打开“文件”App

    然后将图像拖到我的食谱中

    我会调整一下位置 让它看起来更美观!

    我还要着重强调核桃粉 因为它们是关键原料

    介绍完 PaperKit 的功能 我将进一步拆解它的三个主要组件 首先是标记控制器 名为 PaperMarkupViewController 它以交互方式创建和展示 PaperKit 标记和绘画

    第二个是数据模型容器 名为 PaperMarkup 它负责保存和载入 PaperKit 标记 和 PencilKit 绘画数据 并处理标记的呈现

    第三个是新的插入菜单 用于在画布中对标记元素进行注释 在 iOS、iPadOS 和 visionOS 26 上 这个组件名为 MarkupEditViewController

    在 macOS 上 另一个可选方案是新的工具栏 称为 MarkupToolbarViewController 配有绘画工具和用于注释的按钮

    在 App 中整合 PaperKit 非常简单 首先我将介绍 我如何在 iOS 上将它 整合到我的食谱 App 中 然后介绍适用于 macOS 的步骤

    我先将 UIViewController 归入子类 在 viewDidLoad 方法中 我初始化了一个标记数据模型容器 对它进行配置以匹配视图的边界 从而确保正确的布局和渲染背景 接下来 我创建了一个标记控制器 配置了 PaperKit 提供的 全套最新功能

    我使用标准视图控制器嵌入过程 将它添加到视图层次结构中

    要创建工具选择器 我初始化了一个 PencilKit 工具选择器 并将标记控制器注册为观察器 允许它动态响应 工具选择器状态的变化

    为了在我的 App 中 显示工具选择器 我将它分配到 PencilKitResponderState 上的 activeToolPicker 属性 这是 UIResponder 上可用的新 API 用于控制当前响应器的 工具选择器可见性 通过配置 toolPickerVisibility 属性 我可以让工具选择器保持活跃状态 同时显式管理它在屏幕上的可见性 这样 工具选择器就能保持 隐藏状态 同时又能正常运行 仍然会响应轻点两下 和轻捏手势等交互操作 并允许任何 App 支持迷你工具选择器体验 有关设置工具选择器的更多信息 请观看 WWDC19 的 “PencilKit 简介”以及 WWDC24 的 “充分利用 Apple Pencil 的 强大功能”讲座 设置工具选择器后 我将配件项配置为按钮 轻点按钮时 会触发显示插入菜单的功能

    在这个方法中 我使用与标记控制器 相同的功能集初始化了插入控制器

    然后我将控制器的委托 设置为标记视图控制器 将它配置为以弹出窗口形式显示 并将弹出窗口锚定到 我添加到工具选取器的条形按钮项 以确保正确放置

    最后 我以模态方式呈现了 插入菜单控制器

    在 macOS 上 让一切正常运行也同样简单

    设置标记模型和标记控制器 在本质上是一样的

    macOS 上的唯一区别是 可以创建工具栏 来显示插入 UI 在此基础上 将工具栏的委托 设置为标记控制器 并使用标准的 NSViewController 嵌入流程 将它添加到视图层次结构中

    完成基本设置后 有必要停下来思考几个关键因素 这些因素 在优化 App 体验时至关重要

    PaperKit 可以 无缝集成到 SwiftUI 环境中 这些组件封装在 UIViewControllerRepresentable 中 然后直接合并到 SwiftUI 视图的主体中 这样 基于 UIKit 的组件就能 在 SwiftUI 布局中使用 从而保持两个框架之间的兼容性 有关如何将视图控制器集成到 SwiftUI 环境的更多信息 请观看 WWDC20 的 “SwiftUI 的新功能”讲座

    标记控制器包括一个 允许自定处理回调的委托 例如 我可以实现标记更改委托方法 以自动保存对标记模型的任何修改 此外 标记控制器 遵从 Observable 协议 提供了一种使用委托 来管理状态和更新的替代方法

    从磁盘载入数据时 务必始终验证 内容版本以实现向前兼容性 处理版本不匹配有两种常用方法 显示警报以通知需要升级 或显示标记的预先渲染缩略图

    PaperKit 提供了一系列工具 使得实现向前兼容性变得轻而易举 首先 创建一个 CGContext 将缩略图呈现到其中

    然后使用标记模型的绘制函数 生成模型的缩略图

    最后将它与标记一起保存

    在版本不匹配的情况下 显示这个缩略图 被认为是最佳实践 “备忘录”等 App 正是使用这种方法

    介绍完如何在 iOS 和 macOS 上 开始使用 PaperKit 我将深入探讨如何自定 App 来打造 你所设想的标记体验 PaperKit 中提供的全套标记功能 称为 FeatureSet 它定义了向标记和插入控制器 公开的功能和工具

    FeatureSet.latest 为你提供了 PaperKit 支持的 全套标记功能 这是一个很好的起点 因为它可以确保你及时了解 框架中新增的功能

    要自定你的标记体验 你可以使用删除和插入功能 这样你就可以完全控制 你的 App 中可用的工具和交互

    可以在标记中启用 HDR 支持 方式是将功能集上的 colorMaximumLinearExposure 属性 设置为大于 1 的数字 对于 SDR 标记 请设为 1 在工具选择器上 也为 HDR 油墨设置这个属性 对于我的 App 设为 4 能提供我想要的 HDR 效果

    你为 colorMaximumLinearExposure 设置的值 将会进行色调映射 以降低到你的设备屏幕 所支持的 HDR 亮度范围 或者直接使用屏幕支持的值 你可以从 UIScreen 或 NSScreen 中 获取相应的值

    通过使用最新的功能集 并在 App 中启用 HDR 你将获得所有新功能和体验 例如 PencilKit 中引入了 一种名为“Reed Tool”的

    全新书法工具 在 HDR 模式下效果非常出色

    根据你的要求配置功能集后 将自定义功能集 同时分配给标记控制器 和插入控制器 以确保 App 的 标记和插入功能之间的一致性

    另一个可自定的属性 是标记控制器的 contentView 它可以设置为任何 UIView 例如 我可以将模板用作 App 中的固定样式 所有标记和绘画都将在它上面呈现 通过自定 FeatureSet 配置背景视图 并实施前面列出的优化步骤 你的 App 可以提供同样强大的 且覆盖整个系统的标记体验 并支持稳健且富有创意的个性化定制

    接下来该怎么做? 采用 Apple 强大的标记体验 使用你自己选择的工具和墨水 来自定 FeatureSet 设置你自己的内容背景 并为标记添加 HDR 支持

    无论你是在开发轻量级的笔记工具 还是打造一个丰富的创意画布 PaperKit 都能为你提供 创造完美体验所需的元素 我迫不及待想看到大家利用 PaperKit 创造的种种精彩

    谢谢观看!

    • 3:47 - Adopt PaperKit in iOS

      // Adopt PaperKit in iOS
      
      override func viewDidLoad() {
          super.viewDidLoad()
          
          let markupModel = PaperMarkup(bounds: view.bounds)
          let paperViewController = PaperMarkupViewController(markup: markupModel, supportedFeatureSet: .latest)
          view.addSubview(paperViewController.view)
          addChild(paperViewController)
          paperViewController.didMove(toParent: self)
          becomeFirstResponder()    
      
          let toolPicker = PKToolPicker()
          toolPicker.addObserver(paperViewController)
          
          pencilKitResponderState.activeToolPicker = toolPicker
          pencilKitResponderState.toolPickerVisibility = .visible
          
          toolPicker.accessoryItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(plusButtonPressed(_:)))
      }
      
      @objc func plusButtonPressed(_ button: UIBarButtonItem) {
          let markupEditViewController = MarkupEditViewController(supportedFeatureSet: .latest)    
          markupEditViewController.delegate = paperViewController
          markupEditViewController.modalPresentationStyle = .popover
          markupEditViewController.popoverPresentationController?.barButtonItem = button
          present(markupEditViewController, animated: true)
      }
    • 6:11 - Adopt PaperKit in macOS

      // Adopt PaperKit in macOS
      
      override func viewDidLoad() {
          super.viewDidLoad()
          
          let markupModel = PaperMarkup(bounds: view.bounds)
          let paperViewController = PaperMarkupViewController(markup: markupModel, supportedFeatureSet: .latest)
          view.addSubview(paperViewController.view)
          addChild(paperViewController)
      
          // Create toolbar for macOS
          let toolbarViewController = MarkupToolbarViewController(supportedFeatureSet: .latest)
          toolbarViewController.delegate = paperViewController
          view.addSubview(toolbarViewController.view)
          
          // Set layout
          setupLayoutConstraints()
      }
    • 7:18 - Auto-save markup changes

      // Auto-save markup changes
          
      func paperMarkupViewControllerDidChangeMarkup(_ paperMarkupViewController: PaperMarkupViewController) {
          let markupModel = paperMarkupViewController.markup
          Task {
              // Create a data blob and save it
              let data = try await markupModel.dataRepresentation()
              try data.write(toFile: paperKitDataURL)
          }
      }
    • 8:02 - Thumbnail for forward compatibility

      // Thumbnail for forward compatibility
      
      func updateThumbnail(_ markupModel: PaperMarkup) async throws {
          // Set up CGContext to render thumbnail in
          let thumbnailSize = CGSize(width: 200, height: 200)
          let context = makeCGContext(size: thumbnailSize)
          context.setFillColor(gray: 1, alpha: 1)
          context.fill(renderer.format.bounds)            
      
          // Render the PaperKit markup
          await markupModel.draw(in: context, frame: CGRect(origin: .zero, size: thumbnailSize))
          
          thumbnail = context.makeImage()
      }
    • 9:02 - Customized markup FeatureSet

      // Customized markup FeatureSet
          
      var featureSet: FeatureSet = .latest
      
      featureSet.remove(.text)
      featureSet.insert(.stickers)
      
      // HDR support
      featureSet.colorMaximumLinearExposure = 4
      toolPicker.colorMaximumLinearExposure = 4
      
      let paperViewController = PaperMarkupViewController(supportedFeatureSet: featureSet)
      let markupEditViewController = MarkupEditViewController(supportedFeatureSet: featureSet)
    • 10:50 - Custom background on markup controller

      // Custom background on markup controller
      
      let template = UIImage(named: "MyTemplate.jpg")
      let templateView = UIImageView(image: template)
      paperViewController.contentView = templateView
    • 0:00 - 简介
    • 借助 PaperKit,你可以在各个 iOS 和 macOS App (包括“备忘录”、“截屏”、QuickLook 和“手记”App) 中打造丰富的标记体验。这个框架提供了画布,支持绘制和添加形状、图像、文本输入栏等。PaperKit 简化了将标记功能集成到任何 App 的流程,能够为用户带来顺畅的使用体验。

    • 1:36 - 了解 PaperKit
    • 这个示例 App 是一款食谱管理工具,支持用户通过标记功能来创建、更新和注释食谱。这个 App 包含标记控制器、数据模型容器,以及用于便捷注释的插入菜单或工具栏 (具体取决于操作系统)。这个演示中通过添加图像、高亮显示食材以及为传统罗马尼亚饼干食谱评分,展示了这些功能特性。

    • 3:35 - PaperKit 入门
    • 要将 PaperKit 集成到 iOS App 中,需继承 UIViewController 并初始化标记数据模型容器和控制器。随后设置 PencilKit 工具选择器,并配置插入菜单控制器,使它在按钮配件项触发时以弹出框形式显示。 你还可以将 PaperKit 无缝集成到 SwiftUI 环境中。标记控制器包含用于自定处理回调的委托,并遵循 Observable 协议进行状态管理。从磁盘加载数据时,验证内容版本以确保向前兼容性至关重要。PaperKit 提供了用于生成预渲染缩略图的工具,以防出现版本不匹配的情况。

    • 8:37 - 自定功能集
    • PaperKit 的 FeatureSet 定义了 App 中可用的标记功能。你可以从 FeatureSet.latest 开始,以包含所有最新功能。要自定 App,你可以使用提供的函数移除或插入工具和交互。 要启用 HDR 支持,请将 colorMaximumLinearExposure 属性设置为大于 1 的值,这个值会色调映射到设备支持的 HDR 余量。这样做可以提升标记的视觉质量,尤其是在使用 PencilKit 中推出的书法芦苇笔等新工具时。 你还可以自定标记控制器的 contentView 以显示任何 UIView (例如模板),从而为标记和绘图提供一致的背景。

Developer Footer

  • 视频
  • WWDC25
  • 了解 PaperKit
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则