Dynamic Island, iPhone 14 Pro ve daha yeni modellerin üst kısmında, donanım kamera kesimini yazılım bildirimleriyle tek bir arayüz öğesinde birleştiren etkileşimli bir alandır. Dynamic Island, içerik türüne (arama, zamanlayıcı, müzik, Live Activity, AirPods bağlantısı) göre şeklini ve boyutunu uyarlar. Geliştiriciler, ActivityKit ve WidgetKit tabanlı Dynamic Island API aracılığıyla etkileşime girer. Daha fazla bilgi için Dynamic Island HIG adresini ziyaret edin.
Temel Çıkarımlar
Dynamic Island, iPhone 14 Pro, 15 Pro ve daha yeni modellerde, ön kamera ve Face ID sensörleri etrafındaki alanı bildirimleri ve Live Activity'yi göstermek için kullanan bir arayüz öğesidir. Statik siyah bir öğe olan eski çentikten farklı olarak Dynamic Island, dinamik olarak şekil ve boyut değiştirir: bir zamanlayıcı göstermek için genişler, bağlı AirPods simgesi için küçülür, spor skorları için bir dikdörtgene dönüşür.
Teknik uygulama Dynamic Island, OLED ekranın donanım hap şeklindeki kesimine ve çevresindeki yazılım piksel işlemeye dayanır. Sistem, Island alanındaki piksel yenileme hızını 120 Hz'e çıkarır ve içerik ile kameranın siyah alanı arasında yumuşak geçişler için kenar yumuşatma kullanır. Geliştirici, Island'ı doğrudan programlamaz — ActivityKit aracılığıyla içerik oluşturur ve sistem bunu otomatik olarak kesimin etrafına yerleştirir.
Kullanıcı algısı — Dynamic Island, bir donanım kusurunu işlevsel bir öğeye dönüştürür. Apple araştırmalarına göre, kullanıcılar birkaç günlük kullanımdan sonra Island'ı ekranın doğal bir parçası olarak algılar. Vurgulama ve dikkat değiştirme animasyonları — örneğin, gelen bir bildirim Island'ı kaydırır ve içeriği saniyede 120 karede genişleme efektiyle gösterir.
Dynamic Island, sistemin etkinlik türüne ve sayısına göre otomatik olarak seçtiği üç içerik görüntüleme modunu destekler. Geliştirici, WidgetBundle'da her mod için UI'ı tanımlar ancak hangi modun etkin olduğunu kontrol etmez. Sistem ayrıca iki etkinliği aynı anda görüntüleyebilir: biri kesimin solunda, diğeri sağında.
| Mod | Boyut | İçerik | Örnek |
|---|---|---|---|
| Kompakt | ~50pt genişlik | Simge + kısa metin | Zamanlayıcı: saat simgesi + 05:00 |
| Minimal | ~22pt yuvarlak | Sadece uygulama simgesi | Ekran görüntüsü bildirimi |
| Genişletilmiş | ~300pt x 80pt | Özel SwiftUI View | Logolu spor skoru |
Modlar arasında geçiş, ease-in-out eğrisiyle 0,4–0,6 saniyelik bir sistem animasyonuyla gerçekleştirilir. Yeni bir Activity göründüğünde, Island kompakt moddan genişletilmiş moda geçer. Bittiğinde, tekrar küçülür. Kullanıcı, sola kaydırarak genişletilmiş modu zorla daraltabilir — Island, kompakt veya minimal moda geçer. Sistem ayrıca, güncelleme beklenmiyorsa 5 saniyelik hareketsizlikten sonra genişletilmiş modu daraltır.
İki etkinlik — iki uygulamanın etkin Live Activities'si varsa, Dynamic Island bunları kesimin her iki tarafında gösterir. Sol taraf ilk başlatılan Activity, sağ taraf ikincisidir. Yalnızca bir etkinlik varsa, sol tarafı kaplar, sağ taraf boş kalır. Herhangi bir tarafa dokunmak Island'ı genişletir ve o Activity'nin içeriğini gösterir. Çakışma durumunda hangi Activity'ye öncelik verileceğine sistem karar verir.
Dynamic Island içeriği, yalnızca ActivityKit çerçevesiyle Live Activity aracılığıyla oluşturulur. Geliştirici, kodda dört alan tanımlar: kompakt sol (compactLeading), kompakt sağ (compactTrailing), minimal (minimal) ve genişletilmiş (expanded). Her alan, context aracılığıyla Activity'nin mevcut durumunu alan bir SwiftUI View'dir. Bir alan tanımlanmamışsa, Island bu Activity'yi ilgili modda göstermez.
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")
}
}
}
Dynamic Island'da SwiftUI Sınırlamaları — mevcut bileşenler: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (yalnızca Link aracılığıyla), Gauge. Yasak: ScrollView, List, TabView, animasyonlar, jest tanıyıcılar. Renk paleti — yalnızca System Colors (label, secondaryLabel, tint). Yazı tipleri — .caption'dan .title3'e sistem boyutları. Özel yazı tipleri ve SF Symbols doğru şekilde çalışır.
Dynamic Island'ı Test Etme — Xcode, Dynamic Island desteği olan bir simülatör sağlar. Hedef cihaz olarak iPhone 14 Pro veya 15 Pro'yu seçin. ActivityKit, farklı Island modlarını simüle eder: Xcode Debug menüsündeki Dynamic Island Mode düğmesi, kompakt, minimal ve genişletilmiş arasında geçiş yapar. Birden çok Activity'yi aynı anda test etmek için farklı ActivityID'lere sahip şemalar kullanın veya uygulamanın iki örneğini çalıştırın.
Sistem olayları — aramalar, AirPods, Face ID, şarj ve diğerleri — özel Live Activities'den önceliklidir. Bir sistem olayı meydana geldiğinde, Island özel içeriğin görüntülenmesini duraklatır ve sistem içeriğini gösterir. Sistem olayı sona erdikten sonra Island, bir animasyonla özel içeriğe geri döner. Geliştirici sistem olaylarını iptal edemez veya değiştiremez — bunlar iOS işletim sistemi düzeyinde yönetilir.
| Sistem Olayı | Görüntüleme Biçimi | Öncelik |
|---|---|---|
| Gelen Arama | Kişi adıyla minimal kart | Yüksek |
| AirPods | Animasyon + pil şarjı | Orta |
| Face ID | Kilit simgesi | Orta |
| Şarj | Şimşek simgesi + yüzde | Düşük |
| AirDrop | Aktarım ilerlemesi | Orta |
| Ekran Görüntüsü | Deklanşör animasyonu | Düşük |
Gelen arama — en önemli sistem olayı. Dynamic Island, arayanın adını kesimin solunda ve süreyi/durumu sağında gösterir. Etkin bir arama sırasında Island, hiçbir özel Live Activity göstermez. Kullanıcı, arama ekranını açmak için Island'ı genişletebilir veya arka planda etkin aramayla uygulamada çalışmaya devam etmek için daraltabilir.
AirPods bağlantısı — iPhone'un yanında kutu açıldığında, Dynamic Island bağlantıyı canlandırır ve her bir kulaklığın ve kutunun şarjını gösterir. Animasyon 2–3 saniye sürer, ardından Island önceki durumuna döner. Kullanıcının etkin Live Activities'si yoksa, Island boş kalır. AirPods Pro 2, gövdeye basıldığında ses seviyesini ve gürültü önleme modunu da gösterir.
Dynamic Island en iyi uygulamaları Apple tarafından kaliteli bir kullanıcı deneyimi sağlamak için izlenmesi önerilir. Kompakt mod yalnızca en önemli bilgileri göstermelidir — bir simge ve tek bir sayı veya kısa etiket. Genişletilmiş mod — gereksiz öğeler olmadan yalnızca anahtar bilgiler. Kompakt modda 20 karakteri aşan metin yerleştirmekten kaçının — sistem metni üç nokta ile keser.
Dynamic Island için push güncellemeleri — nadir güncellemeler (sipariş durumu, spor sonuçları) için ActivityKit push'u ve sık zamanlayıcılar veya kronometreler için yerel güncellemeler kullanın. Push bildirimleri APNs üzerinden geçer ve Island'da görünmesi 0,5–2 saniye sürer. StaleDate — içerik son kullanma tarihi belirleyin: bir güncelleme zamanında gelmezse, sistem içerik yerine gri bir arka plan göstererek kullanıcıya güncel olmayan verileri bildirir.
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 saniye içinde sonlandırılıyor
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Enerji tüketimi — Dynamic Island ve Live Activities, OLED ekran donanım optimizasyonu sayesinde pil üzerinde minimum etkiye sahiptir. Kesimin etrafındaki siyah pikseller kapatılır ve içerik özel bir yardımcı işlemcide işlenir. Her 5 dakikada bir güncelleme yapıldığında ortalama Live Activity tüketimi, saat başına pilin %1'inden azdır. Pil zayıf olduğunda (%20'nin altında) veya güç tasarrufu modundayken sistem Island'ı otomatik olarak duraklatır.
Dynamic Island için tasarım, ana uygulama UI'ının uyarlanmasını gerektirmez — Island, etkin ekrandan bağımsız olarak çalışır. Live Activity renkleri, sistem Color Assets aracılığıyla sistem temasıyla (açık/koyu) eşleşmelidir. SF Symbols özel simgelere tercih edilir — herhangi bir Island modunda doğru şekilde görüntülenecekleri garanti edilir ve yerleşik Dynamic Type desteğine sahiptir.
Sıkça Sorulan Sorular
Dynamic Island yalnızca iPhone 14 Pro, 14 Pro Max, 15 Pro, 15 Pro Max ve daha yeni modellerde iOS 16.1+ ile kullanılabilir. Çentikli eski iPhone'larda Dynamic Island görüntülenmez — Live Activity, kilit ekranında normal bir banner olarak görünür. Geliştiricinin farklı kod yazması gerekmez: sistem, arayüzü cihazın yeteneklerine göre kendisi uyarlar.
Dynamic Island, aynı anda iki etkinliğin görüntülenmesini destekler — kamera kesiminin soluna ve sağına yerleştirilirler. Yalnızca bir etkinlik varsa, sol tarafı kaplar ve sağ taraf kompakt durumda kalır. Herhangi bir tarafa dokunmak Island'ı genişletir ve ilgili Activity'nin içeriğini gösterir.
Dynamic Island'daki sistem olayları: minimal kart ve kişi adıyla gelen arama, animasyon ve pil şarjıyla AirPods bağlantısı, kilit simgesiyle Face ID, yüzdeyle cihaz şarjı, modem modu, ses seviyesi değişikliği, Sessiz Mod etkinleştirme, aktarım ilerlemesiyle AirDrop ve deklanşör animasyonuyla ekran görüntüsü.
Dynamic Island ayrı bir API gerektirmez — WidgetKit ile birlikte ActivityKit aracılığıyla oluşturulan Live Activities'leri görüntüler. Uygulama, DynamicIsland yapılandırmasıyla bir Activity kaydeder, kompakt, minimal ve genişletilmiş SwiftUI Views tanımlar. Sistem, desteklenen cihazlarda bunu Dynamic Island'da otomatik olarak gösterir.
Dynamic Island, farklı boyutlarda üç görsel durumla sınırlıdır: kompakt 50pt'ye kadar, minimal 22pt'ye kadar, genişletilmiş 300pt'ye kadar. Kompakt modda 20 karakterden uzun metin yerleştirilmesi önerilmez. Yalnızca sistem SwiftUI bileşenleri mevcuttur — Text, Image, ProgressView, Gauge. Özel yazı tipleri ve renkler sistem paletiyle sınırlıdır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun