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を表示します。静的で黒い要素だった従来のノッチとは異なり、Dynamic Islandは動的に形状とサイズを変更します。タイマー表示のために拡張し、接続されたAirPodsのアイコン表示のために縮小し、スポーツスコア表示のために長方形に変わります。
技術的実装 Dynamic Islandは、有機ELディスプレイのハードウェアによるピル型カットアウトと、その周囲のソフトウェアによるピクセル処理に基づいています。システムはIsland領域のピクセルリフレッシュレートを120Hzに引き上げ、コンテンツとカメラの黒い領域の間のスムーズな遷移のためにアンチエイリアシングを使用します。開発者はIslandを直接プログラムするのではなく、ActivityKitを通じてコンテンツを作成し、システムが自動的にカットアウトの周囲に配置します。
ユーザーの認識 — Dynamic Islandはハードウェアの欠点を機能的な要素に変えます。Appleの調査によると、ユーザーは数日使用するだけでIslandを画面の自然な一部として認識します。ハイライトと注意を切り替えるアニメーション — たとえば、着信通知がIslandを移動させ、120フレーム/秒で拡張効果とともにコンテンツを表示します。
Dynamic Islandは3つのコンテンツ表示モードをサポートしており、システムがアクティビティの種類と数に基づいて自動的に選択します。開発者はWidgetBundleで各モードのUIを定義しますが、どのモードが現在アクティブかを制御することはできません。システムは2つのアクティビティを同時に表示することもできます。1つはカットアウトの左側、もう1つは右側です。
| モード | サイズ | コンテンツ | 例 |
|---|---|---|---|
| コンパクト | 約50pt幅 | アイコン+短いテキスト | タイマー:時計アイコン+「05:00」 |
| ミニマル | 約22pt丸型 | アプリアイコンのみ | スクリーンショット通知 |
| 拡張 | 約300pt×80pt | カスタムSwiftUI View | ロゴ入りスポーツスコア |
モード間の遷移は、イージングインアウト曲線で0.4~0.6秒のシステムアニメーションで実行されます。新しいアクティビティが表示されると、Islandはコンパクトモードから拡張モードに拡大します。終了すると、元に戻ります。ユーザーは左スワイプで拡張モードを強制的に折りたたむことができ、Islandはコンパクトまたはミニマルモードに移行します。システムは、更新が予定されていない場合、5秒間操作がないと拡張モードを折りたたみます。
2つのアクティビティ — 2つのアプリがアクティブなLive Activitiesを持っている場合、Dynamic Islandはカットアウトの両側にそれらを表示します。左側が最初に開始されたアクティビティ、右側が2番目です。アクティビティが1つだけの場合、左側を占有し、右側は空のままです。どちらかの側をタップするとIslandが拡張され、そのアクティビティのコンテンツが表示されます。競合が発生した場合、システム自体がどのアクティビティに優先権を与えるかを決定します。
Dynamic Islandコンテンツは、ActivityKitフレームワークを使用したLive Activityを通じてのみ作成されます。開発者はコード内に4つの領域を定義します:コンパクト左(compactLeading)、コンパクト右(compactTrailing)、ミニマル(minimal)、拡張(expanded)です。各領域は、contextを通じてアクティビティの現在の状態を受け取るSwiftUI Viewです。領域が定義されていない場合、Islandは対応するモードでそのアクティビティを表示しません。
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")
}
}
}
Dynamic IslandのSwiftUI制限 — 使用可能なコンポーネント: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のDebugメニューのDynamic Island Modeボタンでコンパクト、ミニマル、拡張を切り替えます。複数のアクティビティを同時にテストするには、異なるActivityIDを持つスキームを使用するか、アプリの2つのインスタンスを起動します。
システムイベント — 電話、AirPods、Face ID、充電など — はカスタムLive Activitiesよりも優先されます。システムイベントが発生すると、Islandはカスタムコンテンツの表示を一時停止し、システムコンテンツを表示します。システムイベントが終了すると、Islandはアニメーションとともにカスタムコンテンツに戻ります。開発者はシステムイベントをキャンセルまたは変更できません。これらはiOSオペレーティングシステムレベルで管理されます。
| システムイベント | 表示形式 | 優先度 |
|---|---|---|
| 着信 | 連絡先名付きミニマルカード | 高 |
| AirPods | アニメーション+バッテリー残量 | 中 |
| Face ID | ロックアイコン | 中 |
| 充電 | 稲妻アイコン+パーセンテージ | 低 |
| AirDrop | 転送進捗 | 中 |
| スクリーンショット | シャッターアニメーション | 低 |
着信 — 最も重要なシステムイベントです。Dynamic Islandはカットアウトの左側に発信者名、右側に通話時間/ステータスを表示します。アクティブな通話中、IslandはカスタムLive Activitiesを表示しません。ユーザーはIslandを拡張して通話画面を開くか、バックグラウンドでアクティブな通話を続けながらアプリでの作業を続けるために折りたたむことができます。
AirPods接続 — iPhoneの近くでケースを開けると、Dynamic Islandが接続をアニメーション表示し、各イヤホンとケースの充電状態を表示します。アニメーションは2~3秒続き、その後Islandは以前の状態に戻ります。ユーザーにアクティブなLive Activitiesがない場合、Islandは空のままです。AirPods Pro 2は、ステムを押すと音量とノイズキャンセレーションモードも表示します。
Dynamic IslandのベストプラクティスはAppleから提供されており、質の高いユーザー体験を確保するために従うことを推奨します。コンパクトモードでは最も重要な情報のみ表示する必要があります — アイコンと1つの数値または短いラベルです。拡張モードでは — 冗長な要素なしでキー情報のみです。コンパクトモードでは20文字を超えるテキストを配置しないでください。システムはテキストを省略記号で切り詰めます。
Dynamic Islandのプッシュ更新 — 稀な更新(注文ステータス、スポーツ結果)にはActivityKit pushを、頻繁なタイマーやストップウォッチにはローカル更新を使用します。プッシュ通知はAPNsを経由し、Islandに表示されるまで0.5~2秒かかります。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は、有機ELディスプレイのハードウェア最適化によりバッテリーへの影響が最小限です。カットアウト周辺の黒いピクセルはオフになっており、コンテンツは専用のコプロセッサでレンダリングされます。5分ごとに更新する場合の平均的なLive Activity消費は、使用1時間あたりバッテリーの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は2つのアクティビティを同時に表示できます — カメラカットアウトの左右に配置されます。アクティビティが1つだけの場合、左側を占有し、右側はコンパクト状態のままです。どちらかの側をタップするとIslandが拡張され、対応するアクティビティのコンテンツが表示されます。
Dynamic Islandのシステムイベント:最小限のカードと連絡先名での着信、アニメーションとバッテリー残量表示付きのAirPods接続、ロックアイコン付きのFace ID、パーセンテージ表示付きのデバイス充電、モデムモード、音量変更、サイレントモードの有効化、転送進捗表示付きのAirDrop、シャッターアニメーション付きのスクリーンショット。
Dynamic Islandには個別のAPIは必要ありません。WidgetKitとともにActivityKitを通じて作成されたLive Activitiesを表示します。アプリはDynamicIsland構成でアクティビティを登録し、コンパクト、ミニマル、拡張のSwiftUI Viewsを定義します。システムはサポート対象デバイスのDynamic Islandに自動的に表示します。
Dynamic Islandは3つの表示状態に制限されており、サイズは異なります:コンパクト(最大50pt)、ミニマル(最大22pt)、拡張(最大300pt)。コンパクトモードでは20文字を超えるテキストを配置することは推奨されません。システムのSwiftUIコンポーネント(Text、Image、ProgressView、Gauge)のみが使用可能です。カスタムフォントと色はシステムパレットに制限されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。