Dynamic Island:是什么,iPhone 的交互式通知

作者: IT Sectr 发布日期: 2026-02-16 阅读时间: 9 分钟

Dynamic Island — iPhone 14 Pro 及更新机型顶部的交互区域,将硬件摄像头切口与软件通知整合为统一的界面元素。Dynamic Island 根据内容类型调整形状和大小:通话、计时器、音乐、Live Activity、AirPods 连接。开发者通过基于 ActivityKit 和 WidgetKit 的 Dynamic Island API 进行交互。更多请参阅 Dynamic Island HIG

要点

  • Dynamic Island — iPhone 14 Pro 及更新机型上的软硬件 UI 元素
  • 三种模式 — 紧凑、最小和展开,具有不同的内容尺寸
  • Live Activities — Dynamic Island 中自定义内容的主要方式
  • 动画 — 系统自动管理 Island 状态之间的过渡
  • 系统事件 — 通话、AirPods、Face ID、充电已集成到 Dynamic Island 中

iPhone 上的 Dynamic Island 是什么?

Dynamic Island — iPhone 14 Pro、15 Pro 及更新机型的界面元素,利用前置摄像头和 Face ID 传感器周围的区域来显示通知和 Live Activity。与旧的静态黑色 notch 切口不同,Dynamic Island 动态改变形状和大小:展开以显示计时器,缩小以显示已连接的 AirPods 图标,变为矩形以显示体育比分。

技术实现 Dynamic Island 基于 OLED 屏幕的硬件切口(药丸形切口)及其周围像素的软件处理。系统将 Island 区域的像素刷新率提高到 120 Hz,并使用平滑处理实现内容与摄像头黑色区域之间的流畅过渡。开发者不直接编程 Island — 他通过 ActivityKit 创建内容,系统自动将其放置在切口周围。

用户感知 Dynamic Island 将硬件缺陷转变为功能元素。根据 Apple 的研究,用户在使用几天后就会将 Island 视为屏幕的自然组成部分。背光和动画吸引注意力 — 例如,通知到达时会移动 Island 并以每秒 120 帧的展开效果显示内容。

Dynamic Island 显示模式

Dynamic Island 支持三种内容显示模式,系统根据活动的类型和数量自动选择。开发者在 WidgetBundle 中为每种模式定义 UI,但不管理当前哪个模式处于活动状态。系统还可以同时显示两个活动:一个在切口左侧,另一个在右侧。

模式尺寸内容示例
紧凑~50pt 宽度图标 + 简短文本计时器:时钟图标 +「05:00」
最小~22pt 圆形仅应用图标截屏通知
展开~300pt x 80pt自定义 SwiftUI View带标志的体育比分

模式之间的过渡通过系统动画完成,持续 0.4–0.6 秒,使用 ease-in-out 曲线。当新的 Activity 出现时,Island 从紧凑模式展开为展开模式。完成时 — 收缩回去。用户可以通过向左滑动强制折叠展开模式 — Island 切换到紧凑或最小模式。系统还会在 5 秒无活动后折叠展开模式,如果不期望有更新的话。

两个活动 — 如果两个应用都有活跃的 Live Activity,Dynamic Island 会在切口两侧显示它们。左侧 — 第一个启动的 Activity,右侧 — 第二个。如果只有一个活动,它占据左侧,右侧保持为空。点击任一侧,Island 展开并显示该 Activity 的内容。系统自行决定在冲突时哪个 Activity 获得优先权。

为 Dynamic Island 创建内容

Dynamic Island 内容完全通过 Live Activity 和 ActivityKit 框架创建。开发者在代码中定义四个区域:紧凑左侧 (compactLeading)、紧凑右侧 (compactTrailing)、最小 (minimal) 和展开 (expanded)。每个区域都是一个 SwiftUI View,通过 context 接收 Activity 的当前状态。如果某个区域未定义,Island 不会在相应模式下显示该 Activity。

swift
struct DeliveryIsland: DynamicIsland {
    var body: some DynamicIslandContent {
        DynamicIslandExpandedContent {
            VStack(alignment: .leading) {
                Text(context.state.status)
                    .font(.headline)
                ProgressView(
                    value: context.state.progress
                )
                Text("ETA: \(context.state.minutes) min")
                    .font(.caption)
            }
        } compactLeading: {
            Image(systemName: "box.truck")
        } compactTrailing: {
            Text("\(context.state.minutes) min")
                .monospacedDigit()
        } minimal: {
            Image(systemName: "box.truck")
        }
    }
}

SwiftUI 在 Dynamic Island 中的限制 — 可用组件:Text、Image、HStack、VStack、ZStack、Spacer、ProgressView、Button(仅通过 Link)、Gauge。禁止:ScrollView、List、TabView、动画、手势识别器。调色板 — 仅 System Colors(label、secondaryLabel、tint)。字体 — 从 .caption 到 .title3 的系统尺寸。自定义字体和 SF Symbols 正常工作。

测试 Dynamic Island — Xcode 提供支持 Dynamic Island 的模拟器。选择 iPhone 14 Pro 或 15 Pro 作为目标设备。ActivityKit 模拟不同的 Island 模式:Xcode 调试菜单中的 Dynamic Island Mode 按钮在紧凑、最小和展开之间切换。要同时测试多个 Activity,请使用具有不同 ActivityID 的方案或运行应用的两个实例。

Dynamic Island 中的系统事件

系统事件 — 通话、AirPods、Face ID、充电等 — 优先于自定义 Live Activity。当发生系统事件时,Island 暂停显示自定义内容并显示系统内容。系统事件完成后,Island 通过动画返回自定义内容。开发者无法取消或更改系统事件 — 它们在 iOS 操作系统级别进行管理。

系统事件显示格式优先级
来电带联系人姓名的最小卡片
AirPods动画 + 电池电量
Face ID锁图标
充电闪电图标 + 百分比
AirDrop传输进度
截屏快门动画

来电 — 最重要的系统事件。Dynamic Island 在切口左侧显示呼叫者姓名,右侧显示时长/状态。在通话期间,Island 不显示任何自定义 Live Activity。用户可以展开 Island 打开通话屏幕,或折叠它以在后台有通话的情况下继续在应用中工作。

连接 AirPods — 在 iPhone 旁边打开充电盒时,Dynamic Island 动画显示连接并显示每个耳机和充电盒的电量。动画持续 2–3 秒,之后 Island 返回之前的状态。如果用户没有活跃的 Live Activity,Island 保持为空。AirPods Pro 2 在按压柄时还会显示音量和降噪模式。

Dynamic Island 最佳开发实践

Dynamic Island 最佳实践Apple 建议遵循以确保优质的用户体验。紧凑模式应仅显示最重要的信息 — 一个图标和一个数字或简短标签。展开模式 — 仅关键信息,没有冗余元素。避免在紧凑模式中放置超过 20 个字符的文本 — 系统会用省略号截断文本。

Dynamic Island 的推送更新 — 对于稀有更新使用 ActivityKit push(订单状态、体育比分),对于频繁的计时器或秒表使用本地更新。推送通知通过 APNs 传输,需要 0.5–2 秒才能在 Island 中显示。StaleDate — 设置内容过期日期:如果更新未及时到达,系统会显示灰色背景而不是内容,向用户提示数据已过时。

swift
func updateDelivery(activity: Activity<DeliveryAttributes>) {
    Task {
        let newContent = ActivityContent(
            state: DeliveryAttributes.ContentState(
                status: .delivered,
                estimatedMinutes: 0
            ),
            staleDate: Date().addingTimeInterval(300)
        )
        await activity.update(newContent)
        // 2 秒后结束 Activity
        try? await Task.sleep(nanoseconds: 2_000_000_000)
        await activity.end(newContent)
    }
}

能耗 — Dynamic Island 和 Live Activities 由于 OLED 屏幕的硬件优化,对电池影响极小。切口周围的黑色像素已关闭,内容在专用协处理器上渲染。Live Activity 的平均功耗 — 每 5 分钟更新一次的情况下,每小时使用不到 1% 的电量。系统会在电池电量低(低于 20%)或省电模式下自动暂停 Island。

Dynamic Island 设计不需要调整应用的主 UI — Island 独立于活动屏幕工作。Live Activity 的颜色应通过系统 Color Assets 与系统主题(浅色/深色)匹配。SF Symbols 优于自定义图标 — 它们保证在任何 Island 模式下正确显示,并内置对 Dynamic Type 的支持。

常见问题

Dynamic Island 在旧款 iPhone 上看起来如何?

Dynamic Island 仅适用于 iPhone 14 Pro、14 Pro Max、15 Pro、15 Pro Max 及更新机型,需 iOS 16.1+。在带有「刘海」的旧款 iPhone 上,Dynamic Island 不显示 — Live Activity 在锁定屏幕上显示为普通横幅。开发者无需编写不同的代码:系统会自动将界面适应设备的能力。

可以在 Dynamic Island 中放置两个 Live Activity 吗?

Dynamic Island 支持同时显示两个活动 — 它们位于摄像头切口的左侧和右侧。如果只有一个活动,它占据左侧,右侧保持在紧凑状态。点击任一侧,Island 展开并显示相应 Activity 的内容。

哪些系统事件使用 Dynamic Island?

Dynamic Island 中的系统事件:来电带最小卡片和联系人姓名,AirPods 连接带动画和电池电量,Face ID 带锁图标,设备充电带百分比,调制解调器模式,音量更改,静音模式激活,AirDrop 带传输进度,截屏带快门动画。

如何向应用添加 Dynamic Island 支持?

Dynamic Island 不需要单独的 API — 它显示通过 ActivityKit 和 WidgetKit 创建的 Live Activity。应用注册具有 DynamicIsland 配置的 Activity,定义紧凑、最小和展开的 SwiftUI View。系统在支持的设备上自动在 Dynamic Island 中显示它。

Dynamic Island 中的内容有限制吗?

Dynamic Island 限于三种不同尺寸的视觉状态:紧凑型最大 50pt,最小型最大 22pt,展开型最大 300pt。在紧凑模式下不建议放置超过 20 个字符的文本。仅系统 SwiftUI 组件可用 — Text、Image、ProgressView、Gauge。自定义字体和颜色限于系统调色板。

总结

  • Dynamic Island — iPhone 14 Pro 及更新机型摄像头切口周围的交互区域
  • 三种模式 — 紧凑、最小和展开,系统管理过渡
  • Live Activity — 通过 ActivityKit 和 WidgetKit 实现自定义内容的唯一方式
  • 系统事件 — 通话、AirPods、Face ID、充电优先于自定义内容
  • SwiftUI 限制 — 仅 Text、Image、ProgressView、HStack、VStack、ZStack、Gauge
  • 能耗 — 每 5 分钟更新一次的情况下,每小时使用不到 1% 的电量
  • 两个活动 — Island 在切口两侧同时显示最多两个活动

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读