Dynamic Island — interaktivní oblast v horní části iPhone 14 Pro a novějších, spojující hardwarový výřez kamery s softwarovými oznámeními do jediného prvku rozhraní. Dynamic Island přizpůsobuje tvar a velikost podle typu obsahu: hovor, časovač, hudba, Live Activity, připojení AirPods. Vývojáři interagují prostřednictvím Dynamic Island API založeného na ActivityKit a WidgetKit. Více na Dynamic Island HIG.
Hlavní body
Dynamic Island — prvek rozhraní iPhone 14 Pro, 15 Pro a novějších, který využívá oblast kolem přední kamery a senzorů Face ID k zobrazování oznámení a Live Activity. Na rozdíl od starého výřezu notch, který byl statickým černým prvkem, Dynamic Island dynamicky mění tvar a velikost: rozšiřuje se pro zobrazení časovače, smršťuje se pro ikonu připojených AirPods, mění se na obdélník pro sportovní výsledky.
Technická implementace Dynamic Island je založena na hardwarovém výřezu (pill-shaped cutout) OLED displeje a softwarovém zpracování pixelů kolem něj. Systém zvyšuje obnovovací frekvenci pixelů na 120 Hz v oblasti Islandu a používá vyhlazování pro plynulý přechod mezi obsahem a černou oblastí kamery. Vývojář neprogramuje Island přímo — vytváří obsah prostřednictvím ActivityKit a systém jej automaticky umisťuje kolem výřezu.
Vnímání uživatelem Dynamic Island mění hardwarovou vadu na funkční prvek. Podle výzkumů Apple uživatelé vnímají Island jako přirozenou součást obrazovky již po několika dnech používání. Podsvícení a animace přitahují pozornost — například příchod oznámení posouvá Island a zobrazuje obsah s efektem rozšíření na 120 snímcích za sekundu.
Dynamic Island podporuje tři režimy zobrazení obsahu, které systém vybírá automaticky na základě typu a počtu aktivit. Vývojář definuje UI pro každý režim ve WidgetBundle, ale neřídí, který režim je aktuálně aktivní. Systém může také zobrazovat dvě aktivity současně: jednu nalevo od výřezu, druhou napravo.
| Režim | Velikost | Obsah | Příklad |
|---|---|---|---|
| Kompaktní | ~50pt šířka | Ikona + krátký text | Časovač: ikona hodin + «05:00» |
| Minimální | ~22pt kruhový | Pouze ikona aplikace | Oznámení o snímku obrazovky |
| Rozšířený | ~300pt x 80pt | Vlastní SwiftUI View | Sportovní skóre s logy |
Přechod mezi režimy probíhá systémovou animací v délce 0.4–0.6 sekundy s křivkou ease-in-out. Při objevení nové Activity se Island rozšiřuje z kompaktního do rozšířeného režimu. Při dokončení — smršťuje se zpět. Uživatel může vynutit sbalení rozšířeného režimu přejetím doleva — Island přejde do kompaktního nebo minimálního režimu. Systém také sbalí rozšířený režim po 5 sekundách nečinnosti, pokud se neočekávají aktualizace.
Dvě aktivity — pokud mají dvě aplikace aktivní Live Activity, Dynamic Island je zobrazuje na obou stranách výřezu. Levá strana — první spuštěná Activity, pravá strana — druhá. Pokud je aktivita pouze jedna, zabírá levou stranu, pravá zůstává prázdná. Po stisknutí libovolné strany se Island rozšíří a zobrazí obsah této Activity. Systém sám rozhoduje, která Activity má prioritu v případě konfliktu.
Obsah Dynamic Island je vytvářen výhradně prostřednictvím Live Activity s frameworkem ActivityKit. Vývojář definuje čtyři oblasti v kódu: kompaktní levou (compactLeading), kompaktní pravou (compactTrailing), minimální (minimal) a rozšířenou (expanded). Každá oblast je SwiftUI View, která přijímá aktuální stav Activity prostřednictvím context. Pokud oblast není definována, Island tuto Activity v odpovídajícím režimu nezobrazuje.
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")
}
}
}
Omezení SwiftUI v Dynamic Island — dostupné komponenty: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (pouze přes Link), Gauge. Zakázané: ScrollView, List, TabView, animace, gesture recognizers. Paleta barev — pouze System Colors (label, secondaryLabel, tint). Písma — systémové velikosti od .caption do .title3. Vlastní písma a SF Symbols fungují správně.
Testování Dynamic Island — Xcode poskytuje simulátor s podporou Dynamic Island. Vyberte iPhone 14 Pro nebo 15 Pro jako cílové zařízení. ActivityKit simuluje různé režimy Islandu: tlačítko Dynamic Island Mode v nabídce Debug v Xcode přepíná mezi kompaktním, minimálním a rozšířeným. Pro testování více Activity současně použijte schémata s různými ActivityID nebo spusťte dvě instance aplikace.
Systémové události — hovory, AirPods, Face ID, nabíjení a další — mají prioritu před vlastními Live Activity. Když dojde k systémové události, Island pozastaví zobrazování vlastního obsahu a zobrazí systémový obsah. Po dokončení systémové události se Island vrátí k vlastnímu obsahu s animací. Vývojář nemůže systémové události zrušit ani změnit — jsou řízeny na úrovni operačního systému iOS.
| Systémová událost | Formát zobrazení | Priorita |
|---|---|---|
| Příchozí hovor | Minimální karta se jménem kontaktu | Vysoká |
| AirPods | Animace + nabití baterie | Střední |
| Face ID | Ikona zámku | Střední |
| Nabíjení | Ikona blesku + procenta | Nízká |
| AirDrop | Průběh přenosu | Střední |
| Snímek obrazovky | Animace závěrky | Nízká |
Příchozí hovor — nejdůležitější systémová událost. Dynamic Island zobrazuje jméno volajícího nalevo od výřezu a délku/status napravo. Během aktivního hovoru Island nezobrazuje žádné vlastní Live Activity. Uživatel může Island rozšířit pro otevření obrazovky hovoru nebo jej sbalit pro pokračování v práci v aplikaci s aktivním hovorem na pozadí.
Připojení AirPods — při otevření pouzdra vedle iPhone Dynamic Island animuje připojení a zobrazuje nabití každého sluchátka a pouzdra. Animace trvá 2–3 sekundy, poté se Island vrátí do předchozího stavu. Pokud uživatel neměl aktivní Live Activity, Island zůstává prázdný. AirPods Pro 2 také zobrazují hlasitost a režim potlačení hluku při stisknutí stopky.
Nejlepší postupy Dynamic Island od Apple jsou doporučeny pro zajištění kvalitního uživatelského zážitku. Kompaktní režim by měl zobrazovat pouze nejdůležitější informace — ikonu a jedno číslo nebo krátký štítek. Rozšířený režim — pouze klíčové informace bez nadbytečných prvků. Vyhněte se umísťování textu v kompaktním režimu, pokud přesahuje 20 znaků — systém text ořízne třemi tečkami.
Push aktualizace pro Dynamic Island — používejte ActivityKit push pro vzácné aktualizace (stav objednávky, sportovní výsledky) a lokální aktualizace pro časté časovače nebo stopky. Push oznámení procházejí přes APNs a trvá 0.5–2 sekundy, než se zobrazí v Islandu. StaleDate — nastavte datum zastarání obsahu: pokud aktualizace nepřijde včas, systém zobrazí šedé pozadí místo obsahu, signalizující uživateli zastaralá data.
func updateDelivery(activity: Activity<DeliveryAttributes>) {
Task {
let newContent = ActivityContent(
state: DeliveryAttributes.ContentState(
status: .delivered,
estimatedMinutes: 0
),
staleDate: Date().addingTimeInterval(300)
)
await activity.update(newContent)
// Ukončujeme Activity za 2 sekundy
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Spotřeba energie — Dynamic Island a Live Activities mají minimální dopad na baterii díky hardwarové optimalizaci OLED displeje. Černé pixely kolem výřezu jsou vypnuté a obsah je renderován na vyhrazeném koprocesoru. Průměrná spotřeba Live Activity — méně než 1 % baterie za hodinu používání při aktualizaci každých 5 minut. Systém automaticky pozastaví Island při nízké baterii (pod 20 %) nebo v režimu úspory energie.
Design pro Dynamic Island nevyžaduje přizpůsobení hlavního UI aplikace — Island pracuje nezávisle na aktivní obrazovce. Barvy Live Activity by měly odpovídat systémovému motivu (světlý/tmavý) prostřednictvím systémových Color Assets. SF Symbols jsou preferovány před vlastními ikonami — zaručují správné zobrazení v jakémkoli režimu Islandu a mají vestavěnou podporu pro Dynamic Type.
Často kladené otázky
Dynamic Island je dostupný pouze na iPhone 14 Pro, 14 Pro Max, 15 Pro, 15 Pro Max a novějších s iOS 16.1+. Na starších iPhone s «ofinkou» se Dynamic Island nezobrazuje — Live Activity se zobrazuje jako běžný banner na uzamčené obrazovce. Vývojář nemusí psát jiný kód: systém sám přizpůsobí rozhraní možnostem zařízení.
Dynamic Island podporuje zobrazení dvou aktivit současně — jsou umístěny nalevo a napravo od výřezu kamery. Pokud je aktivita pouze jedna, zabírá levou stranu, pravá strana zůstává v kompaktním stavu. Po stisknutí libovolné strany se Island rozšíří a zobrazí obsah příslušné Activity.
Systémové události v Dynamic Island: příchozí hovor s minimální kartou a jménem kontaktu, připojení AirPods s animací a nabitím baterie, Face ID s ikonou zámku, nabíjení zařízení s procentem, režim modemu, změna hlasitosti, aktivace Silent Mode, AirDrop s průběhem přenosu a snímek obrazovky s animací závěrky.
Dynamic Island nevyžaduje samostatné API — zobrazuje Live Activity vytvořené prostřednictvím ActivityKit společně s WidgetKit. Aplikace zaregistruje Activity s konfigurací DynamicIsland, definuje kompaktní, minimální a rozšířenou SwiftUI View. Systém ji automaticky zobrazí v Dynamic Island na podporovaných zařízeních.
Dynamic Island je omezen na tři vizuální stavy s různými velikostmi: kompaktní do 50pt, minimální do 22pt, rozšířený do 300pt. V kompaktním režimu se nedoporučuje umísťovat text delší než 20 znaků. Dostupné jsou pouze systémové SwiftUI komponenty — Text, Image, ProgressView, Gauge. Vlastní písma a barvy jsou omezeny systémovou paletou.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také