Dynamic Island — iPhone 14 Pro 及更新机型顶部的交互区域,将硬件摄像头切口与软件通知整合为统一的界面元素。Dynamic Island 根据内容类型调整形状和大小:通话、计时器、音乐、Live Activity、AirPods 连接。开发者通过基于 ActivityKit 和 WidgetKit 的 Dynamic Island API 进行交互。更多请参阅 Dynamic Island HIG。
要点
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 支持三种内容显示模式,系统根据活动的类型和数量自动选择。开发者在 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 内容完全通过 Live Activity 和 ActivityKit 框架创建。开发者在代码中定义四个区域:紧凑左侧 (compactLeading)、紧凑右侧 (compactTrailing)、最小 (minimal) 和展开 (expanded)。每个区域都是一个 SwiftUI View,通过 context 接收 Activity 的当前状态。如果某个区域未定义,Island 不会在相应模式下显示该 Activity。
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 的方案或运行应用的两个实例。
系统事件 — 通话、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 最佳实践Apple 建议遵循以确保优质的用户体验。紧凑模式应仅显示最重要的信息 — 一个图标和一个数字或简短标签。展开模式 — 仅关键信息,没有冗余元素。避免在紧凑模式中放置超过 20 个字符的文本 — 系统会用省略号截断文本。
Dynamic Island 的推送更新 — 对于稀有更新使用 ActivityKit push(订单状态、体育比分),对于频繁的计时器或秒表使用本地更新。推送通知通过 APNs 传输,需要 0.5–2 秒才能在 Island 中显示。StaleDate — 设置内容过期日期:如果更新未及时到达,系统会显示灰色背景而不是内容,向用户提示数据已过时。
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 14 Pro、14 Pro Max、15 Pro、15 Pro Max 及更新机型,需 iOS 16.1+。在带有「刘海」的旧款 iPhone 上,Dynamic Island 不显示 — Live Activity 在锁定屏幕上显示为普通横幅。开发者无需编写不同的代码:系统会自动将界面适应设备的能力。
Dynamic Island 支持同时显示两个活动 — 它们位于摄像头切口的左侧和右侧。如果只有一个活动,它占据左侧,右侧保持在紧凑状态。点击任一侧,Island 展开并显示相应 Activity 的内容。
Dynamic Island 中的系统事件:来电带最小卡片和联系人姓名,AirPods 连接带动画和电池电量,Face ID 带锁图标,设备充电带百分比,调制解调器模式,音量更改,静音模式激活,AirDrop 带传输进度,截屏带快门动画。
Dynamic Island 不需要单独的 API — 它显示通过 ActivityKit 和 WidgetKit 创建的 Live Activity。应用注册具有 DynamicIsland 配置的 Activity,定义紧凑、最小和展开的 SwiftUI View。系统在支持的设备上自动在 Dynamic Island 中显示它。
Dynamic Island 限于三种不同尺寸的视觉状态:紧凑型最大 50pt,最小型最大 22pt,展开型最大 300pt。在紧凑模式下不建议放置超过 20 个字符的文本。仅系统 SwiftUI 组件可用 — Text、Image、ProgressView、Gauge。自定义字体和颜色限于系统调色板。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。