View in English

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

快捷链接

5 快捷链接

视频

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

更多视频

大多数浏览器和
Developer App 均支持流媒体播放。

  • 简介
  • 转写文稿
  • 代码
  • SwiftUI 的新功能

    了解 SwiftUI 中用于为任一 Apple 平台打造出色 App 的新功能。我们将探索如何通过 Liquid Glass 为你的 App 提供焕然一新的外观和风格。了解如何通过框架增强功能和新的 Instrument 来提升性能,以及如何整合网页内容和多信息文本编辑等先进功能。我们还将向你展示 SwiftUI 如何扩充自身的应用范围,包括在三维空间中布局视图。

    章节

    • 0:00 - 简介
    • 1:22 - 让全新设计大放异彩
    • 6:59 - 框架基础
    • 14:33 - 全系统采用 SwiftUI
    • 20:04 - 扩展 SwiftUI 视图
    • 25:01 - 后续步骤

    资源

    • Adopting Liquid Glass
    • Applying Liquid Glass to custom views
    • dragContainer(for:in:selection:_:)
    • draggable(containerItemID:)
    • Human Interface Guidelines
    • Populating SwiftUI menus with adaptive controls
      • 高清视频
      • 标清视频

    相关视频

    WWDC25

    • 了解 SwiftUI 空间布局
    • 了解适用于 SwiftUI 的 WebKit
    • 使用全新设计系统构建 SwiftUI App
    • 借助 SwiftUI 在 visionOS 中设置场景
    • 将 Swift Charts 扩展成三维图表
    • 小组件的新功能
    • 探索 SwiftUI 中的并发机制
    • 提升 iPad App 设计
    • 搭配使用更出色:SwiftUI 和 RealityKit
    • 用于打造沉浸式 App 的 Metal 渲染的新功能
    • 跟着视频学编程:使用 SwiftUI 和 AttributedString 精心打造富文本体验
    • 跟着视频学编程:使用 Xcode 探索本地化
    • 通过 Instrument 优化 SwiftUI 性能
    • 采用 Swift 并发
    • 针对辅助访问自定 App
    • visionOS 26 的新功能
  • 搜索此视频…

    大家好 我是 Anna 我是 Peter 我们是 SwiftUI 团队的工程师 我们很高兴为大家介绍 SwiftUI 的新功能 从低级别的性能改进 一直到用户界面按钮 我们将分享整个系统中的 一些重大改进 现在 你可以更轻松地 与文本和基于网页的内容交互 并能在更多位置用到 SwiftUI 我和 Anna 都有个 仅次于 SwiftUI 的爱好 就是在徒步时拍照 Peter 和我构建了一个 App 来帮助我们计划和分享行程 我们使用了 SwiftUI 的 众多增强功能 为它打造出色的外观和使用体验 首先 我将为大家展示 所有新的系统功能 以及我们如何利用这些功能 让这款 App 大放异彩 我将分享性能、动画 以及布局方面的增强功能 Peter 将为大家介绍 各个 Apple 平台中可以使用 SwiftUI 的新位置 最后 他将重点介绍 SwiftUI 视图中的扩展功能 包括对于网页内容和富文本的支持 我们先来聊聊 你可以如何 利用全新设计打造出色 App 全新的设计系统在 各个 Apple 平台上实现了 明亮、流畅的一致体验

    我和 Peter 重新编译了 我们的 App 让它焕然一新 它的结构并没有改变 但导航容器针对全新设计进行了更新

    在 iPad 和 macOS 上 我们的 App 边栏呈现出玻璃质感的外观 能够映照周边的内容 标签栏也已更新 在 iPhone 上 它们拥有了 更加紧凑的全新外观

    除了标签栏以外 大多数工具栏项目 现在都呈现 Liquid Glass 效果 导航过渡期间 这些项目甚至可以变形 来看一下效果

    我们的 App 使用新的 ToolbarSpacer API 来调整工具栏项目的部分 我们用固定的 Spacer 将向上/向下按钮 与设置按钮区分开来

    为了让工具栏项目更显眼 工具栏中的 Liquid Glass 支持着色

    我和 Peter 应用了 borderedProminent 按钮风格 搭配着色来实现这样的效果 当用户在我们的 App 中向下滚动时 工具栏现在会对 滚动到边缘的栏内容应用模糊效果 这种滚动边缘效果确保了 我们的栏内容始终清晰可辨 无论下层显示什么内容

    用户通常会通过搜索 来查找下一次行程 在 iPhone 上 搜索功能现在位于 屏幕底部 用起来更符合人体工程学 我们现有的代码将 searchable 修饰符置于 NavigationSplitView 外面 我和 Peter 无需更改任何代码 就获得了底部对齐的搜索功能

    通过相同的代码放置方式 我们的 App 在 iPad 上获得了 位于右上角的全新搜索功能外观

    借助 searchable 你可以比以往更快地找到所需内容 对于搜索时显示目标页面的 标签类 App “搜索”标签现在会与标签栏中的 其他标签分开显示 并会变形为搜索栏 将你的标签设为带搜索功能 即可获得更新的外观 整个系统的控件也都焕然一新 例如切换按钮、分段选择器和滑块 我们的自定义视图也是一样 更有 API 助力你在视图中 充分利用全新设计 我们对自定视图应用了玻璃效果 因此它能美观地映现周围的内容 比如我们之前的照片 前述更新不过寥举几例 你可以利用全新设计打造众多精彩 要进一步了解如何利用全新设计 包括采用最佳实践和先进的定制 请观看“使用全新设计 构建 SwiftUI App” 在 iPadOS 26 中 针对用户与你的 App 互动的方式 也有一些激动人心的改进 现在 当用户向下轻扫时 各款 App 会显示一个菜单栏 其中提供了常见操作的快速访问方式

    过去用于在 macOS 上 构建菜单栏的 Commands API 现在能在 iPad 上实现相同的结果 我添加了一些 TextEditingCommands 因为我们的 App 允许用户 为下一次行程快速记录笔记 在计划行程时 人们经常会同时查看多款 App iPad 上的窗口操作更为灵活 用户可以顺畅调整 App 大小

    对于我们这种使用 拆分视图导航的 App 系统会根据可用空间大小 自动显示和隐藏列 为了能调整你的 App 的大小 请移除将屏幕固定为全尺寸的 API 如 UIRequiresFullscreen 这个属性列表键 在 iPadOS 26 中已被弃用 要了解如何为你的 iPad App 设计 可调整大小的窗口和新菜单栏 请观看“提升 iPad App 的设计” macOS 上的窗口大小调整 也变得更顺畅 对于因内容视图尺寸改变 导致的窗口调整 SwiftUI 现在可以同步 相关内容和窗口之间的动画 我们的 App 采用了新的 windowResizeAnchor 来定制动画的来源位置

    它非常适合用于保持 内容各部分之间的连续性 例如在我们的设置视图中切换标签 SwiftUI 构建块的增强功能 也让我们的 App 变得更加强大 从超强的性能表现 到易用性方面的改进 还有全新的内容布局方式 今年是用 SwiftUI 构建 App 的绝佳时机 框架的性能改进 让包括你我的 App 在内的 各个 Apple 平台 App 都受益匪浅 值得分享的 有几个关键领域的重要改进 包括列表、滚动和分析领域 最令我期待的是 macOS 上列表的改进 现在 在 macOS 上加载包含 10 万多条项目的列表现已提速六倍 而这些列表的更新 提速最高达 16 倍 列表越大 性能提升越显著 而且所有平台都有提升

    这改善了用户使用 我们行程规划 App 的体验 无论他们是在查看行程 筛选行程 还是更新现有行程 滚动效果也实现了一些重大改进

    当用户在你的 App 中滚动浏览时 系统会给 SwiftUI 一定的时间 来渲染下一个画面 如果在这个最后期限前 未能完成所有工作 就会导致画面丢失 没人愿意遇到这种情况 这会让用户觉得 你的 App 有故障或加载缓慢 现在 SwiftUI 改进了 iOS 和 macOS 上 用户界面更新的调度 从而加快了响应速度 并允许 SwiftUI 完成更多工作 为即将出现的画面做好准备 总而言之 它降低了 App 丢失画面的几率 同时能以高帧率快速滚动 如果你将惰性 Stack 例如这个图表中的 LazyVStack 放置于 ScrollView 中 SwiftUI 会延迟加载包含的视图 直到视图即将显示才加载 现在 使用惰性 Stack 的 嵌套 ScrollView 也采用这种机制 这非常适合构建照片轮播之类的视图 要了解我们的 App 中 还存在哪些性能问题 我可以使用 Xcode 中的 新 SwiftUI 性能 Instrument 其中提供了多条通道 可供我快速查看 各种性能问题领域 比如 long view body updates 或 platform view updates 看起来 要让我们的 App 像 Peter 徒步那样快如闪电 我们还需要完成一些工作

    要深入了解全新的 Instruments 请观看“通过 Instruments 优化 SwiftUI 性能”

    并发编程是 App 构建的 另一个重要部分 Swift 对结构化并发的支持 允许在编译时验证数据争用安全性 这帮助了我和 Peter 在错误影响到 App 之前 从并发代码中找出错误 要进一步了解如何将 结构化并发添加到你的 App 请观看“采用 Swift 并发” 然后观看 “探索 SwiftUI 中的并发机制” 了解 SwiftUI 如何利用 Swift 并发

    当我们的 App 并发加载其数据时 我和 Peter 在其中显示一个动画 我们使用 Animatable 协议 来添加这个动画效果 在其中定义了一个自定义的 AnimatableData 属性 它会为除绘图方向之外的 所有形状属性添加动画效果

    添加了完整的 AnimatableData 声明后 会发现用于 排除绘图方向的代码量很大 使用新的 Animatable 宏 我可以删除自定义的 AnimatableData 属性 并让 SwiftUI 自动为我合成 我使用 AnimatableIgnored 宏 来排除我不想添加动画效果的属性 例如 绘画方向 布局已提升到全新维度 更准确地说 是实现了三维

    SwiftUI 为你已了解的修饰符 带来了基于深度的新变体 让你可以直接在 SwiftUI 中 完成更多的立体布局 在 visionOS 上 我们可以在 我们的 App 中规划徒步路线 我想添加一个功能 根据我徒步时所在的地点 显示太阳在空中的方位 我没有使用常规的 2D 对齐 而是使用了新的 Alignment3D 类型来对齐太阳 我用 spatialOverlay 修饰符 定位太阳 并根据一天中的时间 调整 overlay 的对齐

    效果太棒了 这样我再也不会被晒伤了 这只是在 visionOS 26 中 对于空间布局增强功能的初步探索 请观看“了解 SwiftUI 空间布局” 进一步了解构建空间体验的新工具 我和 Peter 的背包 总是满满当当 所以我们为 App 添加了 一个空间容器来规划背包的容量 通过新的 manipulable 修饰符 用户可与我们 App 中的物体交互 在这里 我们使用了一个水瓶模型 用户可以将它拾起并移动

    为了明确还需要打包哪些物品 我们使用新的 scene snapping API 从环境中读取这些信息

    根据这些信息 我们为 吸附到桌上的物品添加了基座

    使用新的视体 API 你可以打造一些 非常特别的体验 太棒了

    SwiftUI 拥有许多针对 visionOS 上窗口、空间容器和 场景的增强功能 从窗口恢复到全新场景类型 要了解如何使用这些功能 请观看“借助 SwiftUI 在 visionOS 中设置场景” 观看“visionOS 的新功能” 了解这个平台的所有新功能 哇 这些图像优化增强功能真不错 这样一来 准备我们的下一次 摄影徒步就易如反掌了 可不是嘛 看看我上次行程拍的这张照片

    真是一次名副其实的徒步探险 照片很棒 Anna 拍照位置绝佳 就像今年使用 SwiftUI 的时机一样 你的 App 可以在整个系统中 充分利用 SwiftUI 借助场景的增强功能 以及小组件和控件方面的新 API 各种 App 能与平台更加兼容合一 与其他框架搭配使用时 SwiftUI 的表现更胜以往 场景是你 App 中视图的根容器 它们表示界面的独立部分 你可以通过在 App 代码正文中 声明场景来获得访问 例如 WindowGroup 今年 你还可以通过 Scene bridging 从你的 UIKit 和 AppKit 生命周期 App 请求 SwiftUI 场景 Scene bridging 真是太酷了 它允许你的 UIKit 和 AppKit 生命周期 App 与 SwiftUI 场景进行互操作 App 可以用它来打开 仅限 SwiftUI 的场景类型 或直接通过 UIKit 或 AppKit 代码 使用 SwiftUI 独家功能 你可以使用 MenuBarExtra 和 ImmersiveSpace 之类的场景类型 它还适用于场景修饰符 例如 windowStyle 和 immersiveEnvironmentBehavior 今年 Scene Bridging 可搭配 SwiftUI 中的新场景类型使用 如 RemoteImmersiveSpace 在 macOS Tahoe 和 visionOS 26 中 你的 Mac App 可以使用一种新场景 在 Apple Vision Pro 上渲染立体声内容

    RemoteImmersiveSpace 是一种 macOS 场景 可在 Apple Vision Pro 上 渲染立体声内容 你使用 CompositorService 在 RemoteImmersiveSpace 中渲染 你的 Mac App 可以使用 悬停效果和输入事件 要了解关于 Core ML、 Metal 的更多信息 并搭配 RemoteImmersiveSpace 使用它们 请观看“用于打造沉浸式 App 的 Metal 渲染的新功能” AssistiveAccess 是一种 面向具有认知障碍的用户的 特殊模式 通过采用全新 AssistiveAccess 场景类型 如果有用户通过这种模式使用 iPhone 你的 App 也能显示 UI 要了解有关这个 API 的更多信息 以及如何在 iOS 26 中为你的 App 采用 AssistiveAccess 请观看“针对辅助访问自定 App” 今年 SwiftUI 推出了一些支持 AppKit 协同工作的出色增强功能 除了 Scene bridging 外 还可以显示含 SwiftUI 视图的表单 这是在你的 App 中逐步 采用 SwiftUI 的好方法 你可以使用 NSGestureRecognizerRepresentable 将你的 AppKit 手势桥接到 SwiftUI 你可以在 Interface Builder 中 使用 NSHostingView 今年 SwiftUI 还提供了更多 搭配 RealityKit 的 API 并实现了众多改进 这些增强功能简化了 从你的 SwiftUI 代码 与 RealityKit 互动的所有环节 RealityKit 实体现在遵从 Observable 协议 这样 你就可以轻松观察 你的 SwiftUI 视图中的变化 此外还提供了改进后的 坐标转换 API 以及直接来自 RealityKit 的 内容呈现增强支持 通过使用新组件 你可以直接从 RealityKit 实体 像这样呈现 SwiftUI 弹出窗口 非常适合精确标记 我们下次摄影徒步想去的地方 此外还有更多 SwiftUI 和 RealityKit 之间的集成功能 例如附加组件、同步动画 绑定到组件以及针对 RealityView 的全新尺寸调整行为 要了解 SwiftUI 和 RealityKit 间的持续协作 请观看“搭配使用更出色:SwiftUI 和 RealityKit” 我对控制中心的控件钟爱有加 常常在手机上 用控件来管理我的住宅 用快捷指令控制我的设备 和管理相机体验 今年 自定义控件将登陆 watchOS 26 和 macOS Tahoe 能在这些平台上使用控件 我和 Anna 都感到很兴奋 在 Mac 上 你可以直接 从“控制中心”访问自定义控件 在外出徒步时 我们只需在 Watch 上 轻轻一点 就能标记喜爱的拍照地点 真是棒极了! 我也是小组件的忠实粉丝 我喜欢从我的 App 中 一目了然地获取信息 今年 小组件将登陆 visionOS 和 carPlay 车载 在 visionOS 上 我们可以 自定小组件 在共享空间中的外观 我们在 App 中添加了 一个倒计时小组件 并使用了新的 levelOfDetail 环境值

    当我们靠近小组件 它会展开显示我们上次徒步时 拍摄的一些照片 这是帮助我们了解到 下次摄影徒步日期的好方法 还有 7 天又要出发了! 今年 小组件再添新功能 例如 CarPlay 车载上的实时活动 基于推送的更新 API 以及实现 watchOS 相关性的新 API 要了解更多信息 请观看“小组件的新功能” 今年 SwiftUI 扩展了视图功能 从使用富文本编辑 到制作 3D 图表 SwiftUI 中新增了一些 出色的新视图 以及现有视图的增强功能 要将网页内容直接嵌入 App 中 WebKit 现提供一整套的 SwiftUI API 包括 WebView WebView 是个新的 SwiftUI 视图 用于在你的 App 中显示网页内容 它与 Safari 浏览器一样 由 WebKit 提供支持 你的 App 可以通过初始化 WebView 来显示 URL 为了自定网页并与之交互 WebView 也可以显示 WebPage 这是一种专为 Swift 从头设计的 全新可观察模型类型 WebPage 可以实现 与网页的丰富交互 你可以通过编程方式 在网页上导航并访问页面属性

    WebKit 新增了许多 针对 SwiftUI 的支持 例如自定用户代理 调用 JavaScript 自定 URL 方案等等 要进一步了解所有这些 全新 WebKit API 请观看 “了解适用于 SwiftUI 的 WebKit” 我们一直想让家人相信 我们徒步的地区并非那么起伏不平 借助 Swift Charts 中的 3D 支持 我们可以让他们眼见为实 要显示 3D 图表 我们需要声明 Chart3D Chart3D 会显示三维的绘图 我们可以使用新的 Z 特定修饰符 来指定 3D 空间中的比例 难怪我在上次徒步时会打喷嚏 原来是触发了“弦”机! 要进一步了解 如何将 3D 图表添加到 App 请观看 “将 Swift Charts 扩展成三维图表” 为了帮助我们与其他 App 共享行程数据 我和 Anna 在我们的 Mac App 中 采用了拖放功能 今年 拖放功能为你的 App 带来了 一些非常重要的增强功能 我们可以使用 draggable 修饰符的新变体 搭配新的 dragContainer 修饰符 来拖动多个项目 这样 我们的视图就成为了 拖移项目的容器 我们根据选择返回要移动的物体

    这可通过我们 App 中的 自定选择行为实现 当我们使用这个修饰符 SwiftUI 会在放置发生时 请求以惰性方式拖移项目

    使用新的 DragConfiguration API 我们可以自定从我们的 App 执行拖移时受支持的操作 在这里 我们允许删除 为了观察事件 我们使用新的 onDragSessionUpdated 修饰符 在删除照片之前 我们会检查 以删除作为结束的阶段

    现在当我们将照片拖到程序坞的 废纸篓 照片便会被删除

    为了自定拖动过程中拖动预览的效果 我们可以指定一种排列方式

    堆叠排列方式将项目 整齐地叠放在一起 好极了! 除了计划和分享行程 我和 Anna 还想让朋友们 关注并参与其中 我们一直在研究一种方法 让他们可以评论我们的照片 SwiftUI 对于 富文本编辑的新支持 非常适合用于打造这种体验

    TextView 现在支持 AttributedString 通过将 AttributedString 的绑定 传递到 TextEditor 中 我们已允许朋友使用 内建文本格式设置控件 通过富文本评论我们的照片 真是棒极了!

    你闻到了吗? 闻起来像 SwiftUI 中 美味的富文本 今年还新增了一个 富文本和本地化选项的菜单 请观看“使用 SwiftUI 和 AttributedString 精心打造富文本体验” 以进一步探索 你可以自定段落样式、转换属性 甚至限制用户 在你的 App 中可以使用的属性 再观看“使用 Xcode 探索本地化” 深入了解如何打造 不同语言的出色体验 所有这些新位置都能使用 SwiftUI 这真是太激动人心了 还有许多连到其他位置的“桥”哦 看看我上次徒步拍的这张照片

    我们下次应该去那里 是时候用我们的新 App 多拍一些照片了 在你的 App 中 查看一下使用全新设计的 全新外观和风格 并使用各种新 API 来为你的 App 润色 使用新的性能 instrument 查看你 App 的性能 通过添加空间容器 和新的空间布局 为你的 App 增加新维度 用富文本和 WebKit 的增强功能 为你的 App 添加更丰富的体验 还有充分利用在更多位置 出现的控件和小组件 希望你今年享受自己的 SwiftUI 探险之旅 不知道这些性能改进 能否帮助我应对下次徒步中的山路 准备好出发了吗? 走吧

    • 2:27 - Toolbar spacer

      import SwiftUI
      
      struct TripDetailView: View {
          var body: some View {
              NavigationStack {
                  TripList()
                      .toolbar {
                          ToolbarItemGroup(placement: .primaryAction) {
                              UpButton()
                              DownButton()
                          }
      
                          ToolbarSpacer(.fixed, placement: .primaryAction)
      
                          ToolbarItem(placement: .primaryAction) {
                              SettingsButton()
                          }
                      }
              }
          }
      }
      
      struct TripList: View {
          var body: some View {
              Text("TripList")
          }
      }
      
      struct UpButton: View {
          var body: some View {
              Button("Up", systemImage: "chevron.up") { }
          }
      }
      
      struct DownButton: View {
          var body: some View {
              Button("Down", systemImage: "chevron.down") { }
          }
      }
      
      struct SettingsButton: View {
          var body: some View {
              Button("List Settings", systemImage: "ellipsis") { }
          }
      }
    • 2:52 - Toolbar item tint

      import SwiftUI
      
      struct InspectorView: View {
          var body: some View {
              NavigationStack {
                  InspectorMap()
                      .toolbar {
                          ToolbarItem(placement: .primaryAction) {
                              SaveLocationButton()
                                  .buttonStyle(.borderedProminent)
                                  .tint(.pink)
                          }
                      }
              }
          }
      }
      
      struct InspectorMap: View {
          var body: some View {
              Text("InspectorMap")
          }
      }
      
      struct SaveLocationButton: View {
          var body: some View {
              Button("SaveLocationButton") { }
          }
      }
    • 3:30 - Searchable

      import SwiftUI
      
      struct PlannerSplitView: View {
          @State private var query: String = ""
      
          var body: some View {
              NavigationSplitView {
                  Text("Sidebar")
              } detail: {
                  Text("Detail")
              }
              .searchable(
                  text: $query,
                  prompt: "What are you looking for?"
              )
          }
      }
    • 4:12 - Search tab

      import SwiftUI
      
      struct HealthTabView: View {
          @State private var text: String = ""
          
          var body: some View {
              TabView {
                  Tab("Summary", systemImage: "heart") {
                      NavigationStack {
                          Text("Summary")
                      }
                  }
                  Tab("Sharing", systemImage: "person.2") {
                      NavigationStack {
                          Text("Sharing")
                      }
                  }
                  Tab(role: .search) {
                      NavigationStack {
                          Text("Search")
                      }
                  }
              }
              .searchable(text: $text)
          }
      }
    • 4:37 - Glass effect

      import SwiftUI
      
      struct ToTopButton: View {
          var body: some View {
              Button("To Top", systemImage: "chevron.up") {
                  scrollToTop()
              }
              .padding()
              .glassEffect()
          }
      
          func scrollToTop() {
              // Scroll to top of view
          }
      }
    • 5:20 - Menu bar commands

      import SwiftUI
      
      @main
      struct TravelPhotographyApp: App {
          var body: some Scene {
              WindowGroup {
                  RootView()
              }
              .commands {
                  TextEditingCommands()
              }
          }
      }
      
      struct RootView: View {
          var body: some View {
              Text("RootView")
          }
      }
    • 6:40 - Window resize anchor

      import SwiftUI
      
      struct SettingsTabView: View {
          @State private var selection: SectionTab = .general
          var body: some View {
              TabView(selection: $selection.animation()) {
                  Tab("General", systemImage: "gear", value: .general) {
                      Text("General")
                  }
                  Tab("Sections", systemImage: "list.bullet", value: .sections) {
                      Text("Sections")
                  }
              }
              .windowResizeAnchor(.top)
          }
      }
      
      enum SectionTab: Hashable {
          case general
          case sections
      }
    • 11:24 - @Animatable macro

      import SwiftUI
      
      @Animatable
      struct LoadingArc: Shape {
          var center: CGPoint
          var radius: CGFloat
          var startAngle: Angle
          var endAngle: Angle
          @AnimatableIgnored var drawPathClockwise: Bool
      
          func path(in rect: CGRect) -> Path {
              // Creates a `Path` arc using properties
              return Path()
          }
      }
    • 12:15 - Spatial overlay

      import RealityKit
      import SwiftUI
      
      struct Map: View {
          @Binding var timeAlignment: Alignment3D
      
          var body: some View {
              Model3D(named: "Map")
                  .spatialOverlay(
                      alignment: timeAlignment
                  ) {
                      Sun()
                  }
          }
      }
      
      struct Sun: View {
          var body: some View {
              Model3D(named: "Sun")
          }
      }
    • 13:04 - Manipulable and surface snapping

      import ARKit
      import RealityKit
      import SwiftUI
      
      struct BackpackWaterBottle: View {
          @Environment(\.surfaceSnappingInfo) var snappingInfo: SurfaceSnappingInfo
      
          var body: some View {
              VStackLayout().depthAlignment(.center) {
                  waterBottleView
                      .manipulable()
      
                  Pedestal()
                      .opacity(
                          snappingInfo.classification == .table ? 1.0 : 0.0)
              }
          }
      
          var waterBottleView: some View {
              Model3D(named: "waterBottle")
          }
      }
      
      struct WaterBottleView: View {
          var body: some View {
              Model3D(named: "waterBottle")
          }
      }
      
      struct Pedestal: View {
          var body: some View {
              Model3D(named: "pedestal")
          }
      }
    • 15:00 - SwiftUI scenes

      import SwiftUI
      
      @main
      struct PhotoWalk: App {
          var body: some Scene {
              WindowGroup(id: "AppContents") {
                  PhotoWalkContent()
              }
          }
      }
      
      struct PhotoWalkContent: View {
          var body: some View {
              Text("PhotoWalkContent")
          }
      }
    • 16:28 - Assistive Access scene

      import SwiftUI
      
      @main
      struct PhotoWalk: App {
        var body: some Scene {
          WindowGroup {
            ContentView()
          }
      
          AssistiveAccess {
            AssistiveAccessContentView()
          }
        }
      }
      
      struct ContentView: View {
        var body: some View {
          Text("ContentView")
        }
      }
      
      struct AssistiveAccessContentView: View {
        var body: some View {
          Text("AssistiveAccessContentView")
        }
      }
    • 17:52 - SwiftUI presentations from RealityKit

      import RealityKit
      import SwiftUI
      
      struct PopoverComponentView: View {
          @State private var popoverPresented: Bool = false
          var body: some View {
              RealityView { c in
                  let mapEntity = Entity()
      
                  let popover = Entity()
                  mapEntity.addChild(popover)
                  popover.components[PresentationComponent.self] = PresentationComponent(
                      isPresented: $popoverPresented,
                      configuration: .popover(arrowEdge: .bottom),
                      content: DetailsView()
                  )
              }
          }
      }
      
      struct DetailsView: View {
          var body: some View {
              Text("DetailsView")
          }
      }
    • 19:24 - Level of detail

      import SwiftUI
      import WidgetKit
      
      struct PhotoCountdownView: View {
          @Environment(\.levelOfDetail) var levelOfDetail: LevelOfDetail
          var body: some View {
              switch levelOfDetail {
              case .default:
                  RecentPhotosView()
              case .simplified:
                  CountdownView()
              default:
                  Text("Unknown level of detail")
              }
          }
      }
      
      struct RecentPhotosView: View {
          var body: some View {
              Text("RecentPhotosView")
          }
      }
      
      struct CountdownView: View {
          var body: some View {
              Text("CountdownView")
          }
      }
    • 20:28 - WebView

      import SwiftUI
      import WebKit
      
      struct HikeGuideWebView: View {
          var body: some View {
              WebView(url: sunshineMountainURL)
          }
      
          var sunshineMountainURL: URL {
              URL(string: "sunshineMountainURL")!
          }
      }
    • 20:44 - WebView with WebPage

      import SwiftUI
      import WebKit
      
      struct InAppBrowser: View {
          @State private var page = WebPage()
      
          var body: some View {
              WebView(page)
                  .ignoresSafeArea()
                  .onAppear {
                      page.load(URLRequest(url: sunshineMountainURL))
                  }
          }
      
          var sunshineMountainURL: URL {
              URL(string: "sunshineMountainURL")!
          }
      }
    • 21:35 - 3D charts

      import Charts
      import SwiftUI
      
      struct HikePlotView: View {
          var body: some View {
              Chart3D {
                  SurfacePlot(
                      x: "x", y: "y", z: "z") { x, y in
                          sin(x) * cos(y)
                      }
                      .foregroundStyle(Gradient(colors: [.orange, .pink]))
              }
              .chartXScale(domain: -3 ... 3)
              .chartYScale(domain: -3 ... 3)
              .chartZScale(domain: -3 ... 3)
          }
      }
    • 22:18 - macOS drag and drop

      import SwiftUI
      
      struct DragDropExample: View {
          @State private var selectedPhotos: [Photo.ID] = []
          var body: some View {
              ScrollView {
                  LazyVGrid(columns: gridColumns) {
                      ForEach(model.photos) { photo in
                          view(photo: photo)
                              .draggable(containerItemID: photo.id)
                      }
                  }
              }
              .dragContainer(for: Photo.self, selection: selectedPhotos) { draggedIDs in
                  photos(ids: draggedIDs)
              }
              .dragConfiguration(DragConfiguration(allowMove: false, allowDelete: true))
                  .onDragSessionUpdated { session in
                      let ids = session.draggedItemIDs(for: Photo.ID.self)
                          if session.phase == .ended(.delete) {
                              trash(ids)
                              deletePhotos(ids)
                          }
                  }
              .dragPreviewsFormation(.stack)
          }
      }
    • 23:55 - Rich text view

      import SwiftUI
      
      struct CommentEditor: View {
          @Binding var commentText: AttributedString
      
          var body: some View {
              TextEditor(text: $commentText)
          }
      }

Developer Footer

  • 视频
  • WWDC25
  • SwiftUI 的新功能
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习
    • 开源资源 (英文)
    • 安全性
    • 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. 保留所有权利。
    使用条款 隐私政策 协议和准则