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 πρέπει να αντιστοιχούν στο θέμα συστήματος (ανοιχτό/σκοτεινό) μέσω System 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 εμφανίζεται ως κανονικό banner στην οθόνη κλειδώματος. Ο προγραμματιστής δεν χρειάζεται να γράψει διαφορετικό κώδικα: το σύστημα προσαρμόζει μόνο του τη διεπαφή στις δυνατότητες της συσκευής.
Το 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης