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 Гц в области 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 в качестве target device. ActivityKit симулирует разные режимы Island: кнопка Dynamic Island Mode в Xcode Debug menu переключает между компактным, минимальным и расширенным. Для тестирования нескольких 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также