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 у Xcode Debug менију пребацује између компактног, минималног и проширеног. За тестирање више 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 подржава приказ две активности истовремено — one се налазе лево и десно од изреза камере. Ако постоји само једна активност, заузима леву страну, а десна остаје у компактном стању. Притиском на било коју страну, 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође