WWDC Quick Look 💓 By SwiftGGTeam
Design and build apps for watchOS 10

Design and build apps for watchOS 10

观看原视频

Highlight

watchOS 10 重设计了 Apple Watch 界面,以 SwiftUI 为核心,引入 NavigationSplitView 和 TabView 垂直翻页两种新导航范式,配合全屏背景材质、vibrant 填充和文字标签,让应用在最小的屏幕上呈现最聚焦的信息。

核心内容

十秒钟原则

Apple Watch 用户抬起手腕,只会给你十秒钟。Weather 应用打开直接显示本地当天天气,转一下 Digital Crown 看未来几小时,再转看未来几天。News 在 iPhone 上是多标签、多层级的丰富内容,在手表上只展示五条头条,点击后内联展开。

这个设计思路叫 “Apple Watch Moment”:用户抬腕那一刻,什么信息最相关?Heart Rate 先显示当前心率数值,再用全屏动画展示趋势。Activity 把复杂数据拆成单个聚焦视图。设计手表应用时,先问自己:如果只有十秒,我会展示什么?

Digital Crown 优先的导航

2014 年 Apple Watch 发布时,Digital Crown 被定义为不遮挡屏幕的精确输入设备。watchOS 10 把这个理念推到极致:滚动、分页、精确调整都锚定到表冠,触摸作为备份。

Smart Stack 是这个理念的体现。转一下 Digital Crown,智能排序的小组件依次出现。设计应用时,先想好哪个信息最适合做 Smart Stack 小组件,再围绕这些”当下相关”的体验构建应用架构。

三种导航范式

NavigationSplitView 把源列表藏在详情视图下方,一键可达。Weather 直接进入当天天气详情,点击列表图标切换城市。源列表不需要标题、关闭按钮或导航控件,用更短的导航栏展示更多对比数据。

TabView 新增垂直翻页样式,单个 tab 可以展开容纳滚动内容。Activity 的三个运动环各是一个 tab,滚动到最后是运动历史列表。Tab 切换时支持 matchedGeometryEffect 动画,Activity 环从 TabView 缩放到左上角。

NavigationStack 保留用于深层层级,如 Workout、Calendar、Music。推送动画更新为选中项高亮并移动,更清晰地表达导航关系。

详细内容

05:56

NavigationSplitView {
    List(cities, selection: $selectedCity) { city in
        Text(city.name)
    }
} detail: {
    WeatherDetailView(city: selectedCity)
}

关键点:

  • API 与其他平台一致,但 watchOS 上源列表藏在详情视图下方
  • selectedCity 必须初始化一个默认值,应用启动直接进入详情视图
  • 详情视图不需要标题,信息本身要一目了然
  • 源列表不需要关闭按钮,点击列表图标或滑动即可切换

TabView 垂直翻页与展开

07:53

TabView {
    MoveRingView()
    ExerciseRingView()
    StandRingView()
    RecentWorkoutsList() // 自动检测滚动内容并展开
}
.tabViewStyle(.verticalPage(transitionStyle: .blur))
.containerBackground(.green.gradient, for: .navigation)

关键点:

  • .verticalPage 是 watchOS 10 新增的 tab 视图样式
  • .blur 过渡在 tab 之间产生模糊切换效果
  • containerBackground 为导航容器添加全屏渐变背景
  • TabView 自动检测 List 等滚动内容,展开以容纳

Matched Geometry Effect 驱动动画

09:12

@Namespace private var animationNamespace
@State private var selectedTab = 0

TabView(selection: $selectedTab) {
    MoveRingView()
        .matchedGeometryEffect(id: "rings", in: animationNamespace)
}
.toolbar {
    ToolbarItem(placement: .topBarLeading) {
        ActivityRingsView()
            .matchedGeometryEffect(id: "rings", in: animationNamespace)
            .opacity(selectedTab == 0 ? 0 : 1)
    }
}

关键点:

  • matchedGeometryEffect 连接两个视图,SwiftUI 自动处理位置动画
  • 滚动到 Move tab 时,环从工具栏缩放到 TabView 中的位置
  • 通过 opacity 控制目标视图的显示/隐藏,避免重复渲染
  • 这种动画把交互锚定到 Digital Crown,同时保持关键信息始终可见

Dial-based 布局

13:26

struct DialBasedView: View {
    var body: some View {
        ZStack {
            Rectangle()
                .foregroundStyle(Color.clear)

            Circle()
                .foregroundStyle(Color.red)
                .scenePadding(.horizontal)
        }
        .edgesIgnoringSafeArea(.vertical)
    }
}

关键点:

  • scenePadding(.horizontal) 根据表盘布局网格计算正确边距
  • edgesIgnoringSafeArea(.vertical) 让视图延伸到底部安全区,实现表盘居中
  • 透明 Rectangle 让 ZStack 占满可用宽度,Circle 才能正确定位
  • Dial 布局适合密集信息展示,可在四角添加控制按钮

Toolbar 新放置位置

13:30

.toolbar {
    ToolbarItem(placement: .topBarTrailing) {
        Button(action: {}) {
            Image(systemName: "ellipsis")
        }
    }
    ToolbarItem(placement: .bottomBar) {
        Button(action: {}) {
            Image(systemName: "pause.fill")
        }
        .controlSize(.large)
    }
}

关键点:

  • .topBarTrailing 放置右上角按钮,时间会自动居中让位
  • .topBarLeading 放置左上角按钮
  • .bottomBar 放置底部控制按钮,SwiftUI 自动按布局网格对齐
  • .controlSize(.large) 让按钮更大更突出,适合主要操作

全屏背景材质

17:01

.containerBackground(.green.gradient, for: .navigation)

关键点:

  • containerBackground 是 watchOS 10 新 modifier
  • 支持 .ultraThinMaterial.thinMaterial.regularMaterial.thickMaterial
  • 也支持颜色渐变,如 .green.gradient
  • 系统弹窗默认使用全屏 thin material,提供层级上下文

Vibrant 前景样式

16:22

Text("Decibels")
    .foregroundStyle(.secondary)

Text("85 dB")
    .foregroundStyle(.primary)

Chart { ... }
    .foregroundStyle(.secondary) // 未填充部分

关键点:

  • .primary.secondary.tertiary.quaternary 提供四级信息层次
  • 这些样式带 vibrancy 效果,让背景色透过来
  • 系统颜色也有 vibrant 版本,确保在全屏背景上的可读性
  • List 内容和控件已更新为在 material 背景上显示良好

核心启发

  1. 抬腕即得的天气应用

    • 做什么:做一个极简手表天气应用,打开直接显示当前位置天气,转 Digital Crown 逐小时查看,再转查看未来五天
    • 为什么值得做:NavigationSplitView 让城市列表一键可达,不需要返回按钮,信息密度最大化
    • 怎么开始:用 NavigationSplitView 构建,详情视图用 Dial 布局展示温度和风速,源列表用 List(selection:)
  2. 运动数据仪表盘

    • 做什么:用 TabView 垂直翻页展示心率、步数、卡路里三个指标,每个 tab 用全屏渐变背景区分
    • 为什么值得做matchedGeometryEffect 可以让关键指标在 tab 切换时保持视觉连续性,.verticalPage 让导航完全由 Digital Crown 驱动
    • 怎么开始:定义 @Namespace,在 TabView 和 toolbar 中放置相同 matchedGeometryEffect 的视图,用 containerBackground 设置不同渐变
  3. 专注计时器

    • 做什么:番茄钟应用,全屏背景色随计时状态变化——专注时 calming blue,休息时 soft green,结束时 bright orange
    • 为什么值得做:watchOS 10 的全屏背景材质和 vibrant 文字让状态变化一目了然,不需要看数字就知道当前阶段
    • 怎么开始:用 containerBackground 设置动态颜色,.primary/.secondary 控制文字层次,Digital Crown 调整计时长度
  4. 智能堆叠小组件

    • 做什么:为现有 iOS 应用设计 watchOS Smart Stack 小组件,展示最相关的实时数据
    • 为什么值得做:Smart Stack 是 watchOS 10 的核心入口,用户转 Digital Crown 就能看到,比打开应用更快捷
    • 怎么开始:参考 “Design widgets for the Smart Stack” session,用 WidgetKit 创建 accessoryRectangularaccessoryCircular 样式的小组件

关联 Session

评论

GitHub Issues · utterances