Dynamic Island — o zonă interactivă în partea superioară a iPhone 14 Pro și mai noi, care combină decupajul hardware al camerei cu notificările software într-un singur element de interfață. Dynamic Island își adaptează forma și dimensiunea în funcție de tipul de conținut: apel, cronometru, muzică, Live Activity, conectare AirPods. Dezvoltatorii interacționează prin Dynamic Island API bazat pe ActivityKit și WidgetKit. Mai multe pe Dynamic Island HIG.
Principalele puncte
Dynamic Island — un element de interfață al iPhone 14 Pro, 15 Pro și mai noi, care utilizează zona din jurul camerei frontale și senzorilor Face ID pentru a afișa notificări și Live Activity. Spre deosebire de vechiul decupaj notch, care era un element static negru, Dynamic Island își schimbă dinamic forma și dimensiunea: se extinde pentru a afișa un cronometru, se contractă pentru o pictogramă AirPods conectate, se transformă într-un dreptunghi pentru rezultate sportive.
Implementarea tehnică a Dynamic Island se bazează pe decupajul hardware (pill-shaped cutout) al ecranului OLED și procesarea software a pixelilor din jurul său. Sistemul crește frecvența de reîmprospătare a pixelilor la 120 Hz în zona Island și utilizează netezirea pentru o tranziție lină între conținut și zona neagră a camerei. Dezvoltatorul nu programează Island direct — el creează conținut prin ActivityKit, iar sistemul îl plasează automat în jurul decupajului.
Percepția utilizatorului Dynamic Island transformă un defect hardware într-un element funcțional. Conform cercetărilor Apple, utilizatorii percep Island ca pe o parte naturală a ecranului după câteva zile de utilizare. Iluminarea de fundal și animațiile atrag atenția — de exemplu, sosirea unei notificări deplasează Island și arată conținutul cu un efect de extindere la 120 de cadre pe secundă.
Dynamic Island suportă trei moduri de afișare a conținutului, pe care sistemul le selectează automat pe baza tipului și numărului de activități. Dezvoltatorul definește UI pentru fiecare mod în WidgetBundle, dar nu gestionează care mod este activ în momentul respectiv. Sistemul poate afișa, de asemenea, două activități simultan: una în stânga decupajului, alta în dreapta.
| Mod | Dimensiune | Conținut | Exemplu |
|---|---|---|---|
| Compact | ~50pt lățime | Pictogramă + text scurt | Cronometru: pictogramă ceas + «05:00» |
| Minim | ~22pt circular | Doar pictograma aplicației | Notificare captură ecran |
| Extins | ~300pt x 80pt | SwiftUI View personalizat | Scor sportiv cu logo-uri |
Tranziția între moduri se realizează cu o animație de sistem de 0.4–0.6 secunde cu curbă ease-in-out. La apariția unei noi Activity, Island se extinde din modul compact în cel extins. La finalizare — se contractă înapoi. Utilizatorul poate forța restrângerea modului extins printr-o glisare la stânga — Island trece în modul compact sau minim. Sistemul restrânge, de asemenea, modul extins după 5 secunde de inactivitate, dacă nu sunt așteptate actualizări.
Două activități — dacă două aplicații au Live Activity active, Dynamic Island le afișează pe ambele părți ale decupajului. Partea stângă — prima Activity lansată, partea dreaptă — a doua. Dacă există o singură activitate, ocupă partea stângă, partea dreaptă rămânând goală. La apăsarea oricărei părți, Island se extinde și afișează conținutul acelei Activity. Sistemul decide singur care Activity are prioritate în caz de conflict.
Conținutul Dynamic Island este creat exclusiv prin Live Activity cu framework-ul ActivityKit. Dezvoltatorul definește patru zone în cod: compactă stânga (compactLeading), compactă dreapta (compactTrailing), minimă (minimal) și extinsă (expanded). Fiecare zonă este o SwiftUI View care primește starea curentă a Activity prin context. Dacă o zonă nu este definită, Island nu afișează această Activity în modul corespunzător.
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")
}
}
}
Limitări SwiftUI în Dynamic Island — componente disponibile: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (doar prin Link), Gauge. Interzise: ScrollView, List, TabView, animații, gesture recognizers. Paleta de culori — doar System Colors (label, secondaryLabel, tint). Fonturi — dimensiuni sistem de la .caption la .title3. Fonturile personalizate și SF Symbols funcționează corect.
Testarea Dynamic Island — Xcode oferă un simulator cu suport Dynamic Island. Selectați iPhone 14 Pro sau 15 Pro ca dispozitiv țintă. ActivityKit simulează diferite moduri Island: butonul Dynamic Island Mode din meniul Debug al Xcode comută între compact, minim și extins. Pentru testarea mai multor Activity simultan, utilizați scheme cu ActivityID diferite sau rulați două instanțe ale aplicației.
Evenimentele de sistem — apeluri, AirPods, Face ID, încărcare și altele — au prioritate față de Live Activity-urile personalizate. Când are loc un eveniment de sistem, Island întrerupe afișarea conținutului personalizat și arată conținutul de sistem. După finalizarea evenimentului de sistem, Island revine la conținutul personalizat cu o animație. Dezvoltatorul nu poate anula sau modifica evenimentele de sistem — ele sunt gestionate la nivelul sistemului de operare iOS.
| Eveniment de sistem | Format de afișare | Prioritate |
|---|---|---|
| Apel primit | Card minim cu numele contactului | Ridicată |
| AirPods | Animație + încărcare baterie | Medie |
| Face ID | Pictogramă lacăt | Medie |
| Încărcare | Pictogramă fulger + procente | Scăzută |
| AirDrop | Progres transfer | Medie |
| Captură ecran | Animație declanșator | Scăzută |
Apelul primit — cel mai important eveniment de sistem. Dynamic Island afișează numele apelantului în stânga decupajului și durata/statusul în dreapta. În timpul unui apel activ, Island nu afișează nicio Live Activity personalizată. Utilizatorul poate extinde Island pentru a deschide ecranul de apel sau îl poate restrânge pentru a continua lucrul în aplicație cu apelul activ în fundal.
Conectarea AirPods — la deschiderea carcasei lângă iPhone, Dynamic Island animează conectarea și afișează încărcarea fiecărei căști și a carcasei. Animația durează 2–3 secunde, după care Island revine la starea anterioară. Dacă utilizatorul nu avea Live Activity active, Island rămâne gol. AirPods Pro 2 afișează, de asemenea, volumul și modul de anulare a zgomotului la apăsarea tijei.
Cele mai bune practici Dynamic Island recomandate de Apple pentru asigurarea unei experiențe de utilizare de calitate. Modul compact ar trebui să afișeze doar cele mai importante informații — o pictogramă și un număr sau o etichetă scurtă. Modul extins — doar informațiile cheie fără elemente redundante. Evitați plasarea textului în modul compact dacă depășește 20 de caractere — sistemul trunchiază textul cu puncte de suspensie.
Actualizări Push pentru Dynamic Island — utilizați ActivityKit push pentru actualizări rare (stare comandă, rezultate sportive) și actualizări locale pentru cronometre frecvente sau cronoscoape. Notificările push trec prin APNs și durează 0.5–2 secunde până la afișarea în Island. StaleDate — setați data de expirare a conținutului: dacă actualizarea nu sosește la timp, sistemul afișează un fundal gri în loc de conținut, semnalând utilizatorului date învechite.
func updateDelivery(activity: Activity<DeliveryAttributes>) {
Task {
let newContent = ActivityContent(
state: DeliveryAttributes.ContentState(
status: .delivered,
estimatedMinutes: 0
),
staleDate: Date().addingTimeInterval(300)
)
await activity.update(newContent)
// Finalizăm Activity peste 2 secunde
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Consumul de energie — Dynamic Island și Live Activities au un impact minim asupra bateriei datorită optimizării hardware a ecranului OLED. Pixelii negri din jurul decupajului sunt dezactivați, iar conținutul este randat pe un coprocesor dedicat. Consumul mediu al Live Activity — sub 1% din baterie pe oră de utilizare cu actualizare la fiecare 5 minute. Sistemul întrerupe automat Island la baterie scăzută (sub 20%) sau în modul de economisire a energiei.
Design pentru Dynamic Island nu necesită adaptarea UI-ului principal al aplicației — Island funcționează independent de ecranul activ. Culorile Live Activity trebuie să corespundă temei de sistem (luminos/întunecat) prin Color Assets de sistem. SF Symbols sunt preferabile pictogramelor personalizate — acestea garantează afișarea corectă în orice mod Island și au suport încorporat pentru Dynamic Type.
Întrebări frecvente
Dynamic Island este disponibil doar pe iPhone 14 Pro, 14 Pro Max, 15 Pro, 15 Pro Max și mai noi cu iOS 16.1+. Pe iPhone-urile vechi cu «sprânceană» Dynamic Island nu se afișează — Live Activity apare ca un banner obișnuit pe ecranul de blocare. Dezvoltatorul nu trebuie să scrie cod diferit: sistemul adaptează singur interfața la capacitățile dispozitivului.
Dynamic Island suportă afișarea a două activități simultan — acestea sunt amplasate în stânga și dreapta decupajului camerei. Dacă există o singură activitate, aceasta ocupă partea stângă, iar partea dreaptă rămâne în stare compactă. La apăsarea oricărei părți, Island se extinde și afișează conținutul Activity corespunzătoare.
Evenimentele de sistem în Dynamic Island: apel primit cu card minim și numele contactului, conectare AirPods cu animație și încărcare baterie, Face ID cu pictogramă lacăt, încărcare dispozitiv cu procent, mod modem, schimbare volum, activare Silent Mode, AirDrop cu progresul transferului și captură ecran cu animație declanșator.
Dynamic Island nu necesită un API separat — el afișează Live Activity create prin ActivityKit împreună cu WidgetKit. Aplicația înregistrează o Activity cu configurația DynamicIsland, definește SwiftUI View compact, minim și extins. Sistemul o afișează automat în Dynamic Island pe dispozitivele suportate.
Dynamic Island este limitat la trei stări vizuale cu dimensiuni diferite: compact până la 50pt, minim până la 22pt, extins până la 300pt. În modul compact nu se recomandă plasarea textului mai lung de 20 de caractere. Sunt disponibile doar componentele SwiftUI de sistem — Text, Image, ProgressView, Gauge. Fonturile și culorile personalizate sunt limitate la paleta de sistem.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și