Dynamic Island — интерактивна зона в горната част на iPhone 14 Pro и по-новите, която обединява хардуерния изрез на камерата със софтуерни известия в един елемент на интерфейса. Dynamic Island адаптира формата и размера според типа съдържание: обаждане, таймер, музика, Live Activity, свързване на AirPods. Разработчиците взаимодействат чрез Dynamic Island API, базиран на ActivityKit и WidgetKit. Повече на Dynamic Island HIG.
Основни точки
Dynamic Island — елемент на интерфейса на iPhone 14 Pro, 15 Pro и по-новите, който използва зоната около предната камера и Face ID сензорите за показване на известия и Live Activity. За разлика от стария изрез notch, който беше статичен черен елемент, Dynamic Island динамично променя формата и размера си: разширява се за показване на таймер, свива се за икона на свързани AirPods, превръща се в правоъгълник за спортни резултати.
Техническа реализация Dynamic Island се основава на хардуерния изрез (pill-shaped cutout) на OLED екрана и софтуерната обработка на пикселите около него. Системата увеличава честотата на опресняване на пикселите до 120 Hz в зоната на Island и използва изглаждане за плавен преход между съдържанието и черната зона на камерата. Разработчикът не програмира Island директно — той създава съдържание чрез ActivityKit, а системата го поставя автоматично около изреза.
Възприятие от потребителя Dynamic Island превръща хардуерен недостатък във функционален елемент. Според проучвания на Apple, потребителите възприемат Island като естествена част от екрана още след няколко дни употреба. Осветлението и анимациите привличат вниманието — например, пристигането на известие измества Island и показва съдържание с ефект на разширение при 120 кадъра в секунда.
Dynamic Island поддържа три режима на показване на съдържание, които системата избира автоматично въз основа на типа и броя на активностите. Разработчикът определя UI за всеки режим в WidgetBundle, но не управлява кой режим е активен в момента. Системата може също да показва две активности едновременно: една отляво на изреза, друга отдясно.
| Режим | Размер | Съдържание | Пример |
|---|---|---|---|
| Компактен | ~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, която получава текущото състояние на Activity чрез context. Ако област не е дефинирана, 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, анимации, gesture recognizers. Цветова палитра — само System Colors (label, secondaryLabel, tint). Шрифтове — системни размери от .caption до .title3. Персонализирани шрифтове и SF Symbols работят коректно.
Тестване на Dynamic Island — Xcode предоставя симулатор с поддръжка на Dynamic Island. Изберете iPhone 14 Pro или 15 Pro като целево устройство. ActivityKit симулира различни режими на Island: бутонът Dynamic Island Mode в менюто Debug на Xcode превключва между компактен, минимален и разширен. За тестване на множество 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 знака — системата съкращава текста с многоточие.
Push актуализации за Dynamic Island — използвайте ActivityKit push за редки актуализации (статус на поръчка, спортни резултати) и локални актуализации за чести таймери или хронометри. 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)
// Приключваме Activity след 2 секунди
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Консумация на енергия — Dynamic Island и Live Activities имат минимално влияние върху батерията благодарение на хардуерната оптимизация на OLED екрана. Черните пиксели около изреза са изключени, а съдържанието се рендерира на специален копроцесор. Средна консумация на Live Activity — по-малко от 1% от батерията за час употреба при актуализация на всеки 5 минути. Системата автоматично спира Island при ниско ниво на батерията (под 20%) или в режим на пестене на енергия.
Дизайн за 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 с икона на ключалка, зареждане на устройството с процент, режим на модем, промяна на звука, активиране на Silent Mode, AirDrop с напредък на прехвърлянето и екранна снимка с анимация на затвора.
Dynamic Island не изисква отделен API — той показва Live Activity, създадена чрез ActivityKit заедно с WidgetKit. Приложението регистрира Activity с конфигурация DynamicIsland, дефинира компактен, минимален и разширен SwiftUI View. Системата автоматично го показва в Dynamic Island на поддържани устройства.
Dynamic Island е ограничен до три визуални състояния с различни размери: компактно до 50pt, минимално до 22pt, разширено до 300pt. В компактен режим не се препоръчва поставянето на текст по-дълъг от 20 знака. Достъпни са само системни SwiftUI компоненти — Text, Image, ProgressView, Gauge. Персонализираните шрифтове и цветове са ограничени до системната палитра.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също