Dynamic Island è un'area interattiva nella parte superiore di iPhone 14 Pro e modelli successivi, che combina il ritaglio hardware della fotocamera con le notifiche software in un unico elemento dell'interfaccia. Dynamic Island adatta forma e dimensione al tipo di contenuto: chiamata, timer, musica, Live Activity, connessione AirPods. Gli sviluppatori interagiscono tramite l'API Dynamic Island basata su ActivityKit e WidgetKit. Ulteriori informazioni su Dynamic Island HIG.
Punti chiave
Dynamic Island è un elemento dell'interfaccia di iPhone 14 Pro, 15 Pro e modelli successivi che utilizza l'area intorno alla fotocamera frontale e ai sensori Face ID per visualizzare notifiche e Live Activity. A differenza del vecchio notch, che era un elemento nero statico, Dynamic Island cambia dinamicamente forma e dimensione: si espande per mostrare un timer, si restringe per un'icona di AirPods connessi, si trasforma in un rettangolo per risultati sportivi.
Implementazione tecnica di Dynamic Island si basa sul ritaglio hardware a forma di pillola del display OLED e sull'elaborazione software dei pixel circostanti. Il sistema aumenta la frequenza di aggiornamento dei pixel a 120 Hz nell'area di Island e utilizza l'anti-aliasing per transizioni fluide tra il contenuto e l'area nera della fotocamera. Lo sviluppatore non programma Island direttamente — crea contenuti tramite ActivityKit e il sistema li posiziona automaticamente intorno al ritaglio.
Percezione dell'utente — Dynamic Island trasforma un difetto hardware in un elemento funzionale. Secondo le ricerche di Apple, gli utenti percepiscono Island come una parte naturale dello schermo dopo solo pochi giorni di utilizzo. Le animazioni di evidenziazione e cambio di attenzione — ad esempio, una notifica in arrivo sposta Island e mostra il contenuto con un effetto di espansione a 120 fotogrammi al secondo.
Dynamic Island supporta tre modalità di visualizzazione dei contenuti, che il sistema seleziona automaticamente in base al tipo e al numero di attività. Lo sviluppatore definisce l'UI per ogni modalità in WidgetBundle, ma non controlla quale modalità è attiva in un dato momento. Il sistema può anche visualizzare due attività contemporaneamente: una a sinistra del ritaglio, l'altra a destra.
| Modalità | Dimensione | Contenuto | Esempio |
|---|---|---|---|
| Compatta | ~50pt larghezza | Icona + testo breve | Timer: icona orologio + 05:00 |
| Minima | ~22pt rotonda | Solo icona app | Notifica screenshot |
| Estesa | ~300pt x 80pt | SwiftUI View personalizzata | Punteggio sportivo con loghi |
Transizione tra le modalità viene eseguita con un'animazione di sistema di 0,4–0,6 secondi con curva ease-in-out. Quando appare una nuova Activity, Island si espande dalla modalità compatta a quella estesa. Al termine, si contrae di nuovo. L'utente può forzare la chiusura della modalità estesa con uno swipe a sinistra — Island passa alla modalità compatta o minima. Il sistema contrae anche la modalità estesa dopo 5 secondi di inattività se non sono previsti aggiornamenti.
Due attività — se due app hanno Live Activities attive, Dynamic Island le mostra su entrambi i lati del ritaglio. Il lato sinistro è la prima Activity avviata, il destro è la seconda. Se c'è una sola attività, occupa il lato sinistro, il destro rimane vuoto. Toccare un lato qualsiasi espande Island e mostra il contenuto di quell'Activity. Il sistema stesso decide quale Activity ha la priorità in caso di conflitto.
I contenuti di Dynamic Island vengono creati esclusivamente tramite Live Activity con il framework ActivityKit. Lo sviluppatore definisce quattro aree nel codice: compatta sinistra (compactLeading), compatta destra (compactTrailing), minima (minimal) ed estesa (expanded). Ogni area è una SwiftUI View che riceve lo stato corrente dell'Activity tramite context. Se un'area non è definita, Island non mostra quell'Activity nella modalità corrispondente.
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")
}
}
}
Limitazioni di SwiftUI in Dynamic Island — componenti disponibili: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (solo tramite Link), Gauge. Vietati: ScrollView, List, TabView, animazioni, gesture recognizers. Tavolozza colori — solo System Colors (label, secondaryLabel, tint). Caratteri — dimensioni di sistema da .caption a .title3. I caratteri personalizzati e SF Symbols funzionano correttamente.
Test di Dynamic Island — Xcode fornisce un simulatore con supporto per Dynamic Island. Selezionare iPhone 14 Pro o 15 Pro come dispositivo di destinazione. ActivityKit simula diverse modalità di Island: il pulsante Dynamic Island Mode nel menu Debug di Xcode passa tra compatta, minima ed estesa. Per testare più Activities contemporaneamente, utilizzare schemi con ActivityID diversi o avviare due istanze dell'app.
Eventi di sistema — chiamate, AirPods, Face ID, ricarica e altri — hanno la priorità sulle Live Activities personalizzate. Quando si verifica un evento di sistema, Island mette in pausa la visualizzazione del contenuto personalizzato e mostra il contenuto di sistema. Al termine dell'evento di sistema, Island torna al contenuto personalizzato con un'animazione. Lo sviluppatore non può annullare o modificare gli eventi di sistema — sono gestiti a livello di sistema operativo iOS.
| Evento di sistema | Formato di visualizzazione | Priorità |
|---|---|---|
| Chiamata in arrivo | Scheda minima con nome contatto | Alta |
| AirPods | Animazione + carica batteria | Media |
| Face ID | Icona lucchetto | Media |
| Ricarica | Icona fulmine + percentuale | Bassa |
| AirDrop | Avanzamento trasferimento | Media |
| Screenshot | Animazione otturatore | Bassa |
Chiamata in arrivo — l'evento di sistema più importante. Dynamic Island mostra il nome del chiamante a sinistra del ritaglio e la durata/stato a destra. Durante una chiamata attiva, Island non mostra alcuna Live Activity personalizzata. L'utente può espandere Island per aprire la schermata della chiamata o contrarla per continuare a lavorare nell'app con la chiamata attiva in background.
Connessione AirPods — all'apertura della custodia vicino all'iPhone, Dynamic Island anima la connessione e mostra la carica di ciascun auricolare e della custodia. L'animazione dura 2–3 secondi, dopodiché Island torna allo stato precedente. Se l'utente non aveva Live Activities attive, Island rimane vuota. AirPods Pro 2 mostrano anche il volume e la modalità di cancellazione del rumore quando si preme lo stelo.
Migliori pratiche di Dynamic Island di Apple sono raccomandate per garantire un'esperienza utente di qualità. La modalità compatta dovrebbe mostrare solo le informazioni più importanti — un'icona e un singolo numero o etichetta breve. La modalità estesa — solo informazioni chiave senza elementi ridondanti. Evitare di posizionare testo in modalità compatta se supera i 20 caratteri — il sistema tronca il testo con i puntini di sospensione.
Aggiornamenti push per Dynamic Island — utilizzare ActivityKit push per aggiornamenti rari (stato ordine, risultati sportivi) e aggiornamenti locali per timer frequenti o cronometri. Le notifiche push passano attraverso APNs e impiegano 0,5–2 secondi per apparire in Island. StaleDate — impostare una data di scadenza del contenuto: se un aggiornamento non arriva in tempo, il sistema mostra uno sfondo grigio invece del contenuto, segnalando all'utente dati obsoleti.
func updateDelivery(activity: Activity<DeliveryAttributes>) {
Task {
let newContent = ActivityContent(
state: DeliveryAttributes.ContentState(
status: .delivered,
estimatedMinutes: 0
),
staleDate: Date().addingTimeInterval(300)
)
await activity.update(newContent)
// Terminazione Activity in 2 secondi
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Consumo energetico — Dynamic Island e Live Activities hanno un impatto minimo sulla batteria grazie all'ottimizzazione hardware del display OLED. I pixel neri intorno al ritaglio sono spenti e il contenuto viene renderizzato su un coprocessore dedicato. Il consumo medio di Live Activity è inferiore all'1% della batteria per ora di utilizzo con aggiornamento ogni 5 minuti. Il sistema mette automaticamente in pausa Island quando la batteria è scarica (sotto il 20%) o in modalità di risparmio energetico.
Design per Dynamic Island non richiede l'adattamento dell'UI principale dell'app — Island funziona indipendentemente dallo schermo attivo. I colori della Live Activity devono corrispondere al tema di sistema (chiaro/scuro) tramite Color Assets di sistema. SF Symbols sono preferibili alle icone personalizzate — sono garantiti per essere visualizzati correttamente in qualsiasi modalità di Island e hanno il supporto integrato per Dynamic Type.
Domande frequenti
Dynamic Island è disponibile solo su iPhone 14 Pro, 14 Pro Max, 15 Pro, 15 Pro Max e successivi con iOS 16.1+. Sui vecchi iPhone con notch, Dynamic Island non viene visualizzata — Live Activity appare come un banner normale sulla schermata di blocco. Lo sviluppatore non deve scrivere codice diverso: il sistema stesso adatta l'interfaccia alle capacità del dispositivo.
Dynamic Island supporta la visualizzazione di due attività contemporaneamente — vengono posizionate a sinistra e a destra del ritaglio della fotocamera. Se c'è una sola attività, occupa il lato sinistro e il destro rimane in stato compatto. Toccare un lato qualsiasi espande Island e mostra il contenuto dell'Activity corrispondente.
Eventi di sistema in Dynamic Island: chiamata in arrivo con scheda minima e nome del contatto, connessione AirPods con animazione e carica della batteria, Face ID con icona lucchetto, ricarica del dispositivo con percentuale, modalità modem, cambio volume, attivazione della modalità silenziosa, AirDrop con avanzamento trasferimento e screenshot con animazione dell'otturatore.
Dynamic Island non richiede un'API separata — mostra Live Activities create tramite ActivityKit insieme a WidgetKit. L'app registra un'Activity con configurazione DynamicIsland, definisce SwiftUI View compatta, minima ed estesa. Il sistema la mostra automaticamente in Dynamic Island sui dispositivi supportati.
Dynamic Island è limitata a tre stati visivi con dimensioni diverse: compatta fino a 50pt, minima fino a 22pt, estesa fino a 300pt. In modalità compatta, non è consigliato posizionare testo più lungo di 20 caratteri. Sono disponibili solo componenti SwiftUI di sistema — Text, Image, ProgressView, Gauge. Caratteri e colori personalizzati sono limitati alla tavolozza di sistema.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche