Font Descriptor: βασικές έννοιες και δυνατότητες του περιγραφέα γραμματοσειράς

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-23 Χρόνος ανάγνωσης: 9 λεπ

Font Descriptor — είναι το αντικείμενο UIFontDescriptor στο iOS και NSFontDescriptor στο macOS, που ενσωματώνει όλα τα μεταδεδομένα γραμματοσειράς: οικογένεια, κοπή, μέγεθος, διάστημα γραμμάτων, διάστημα γραμμών και τυπογραφικά γνωρίσματα. Αντί να δημιουργείτε γραμματοσειρά απευθείας μέσω UIFont(name:size:), ο προγραμματιστής περιγράφει τα επιθυμητά χαρακτηριστικά μέσω ενός περιγραφέα, και το σύστημα επιλέγει την καλύτερη αντιστοιχία από τις διαθέσιμες γραμματοσειρές. Σύμφωνα με την Apple Developer Documentation, το UIFontDescriptor υποστηρίζει πάνω από 20 γνωρίσματα γραμματοσειράς και χρησιμοποιείται σε όλα τα πλαίσια τυπογραφίας iOS — από UIKit μέχρι Core Text και SwiftUI.

Βασικά σημεία

  • Font Descriptor — αντικείμενο περιγραφής γραμματοσειράς με μεταδεδομένα για την οικογένεια, την κοπή, το μέγεθος και τα τυπογραφικά γνωρίσματα
  • Επιτρέπει τη δημιουργία UIFont από ένα σύνολο γνωρισμάτων χωρίς να καθορίζεται το συγκεκριμένο όνομα γραμματοσειράς
  • Υποστηρίζει την τροποποίηση υπάρχουσας γραμματοσειράς: αλλαγή μεγέθους, κοπής, kerning χωρίς δημιουργία νέου αντικειμένου
  • Χρησιμοποιείται σε UIKit, Core Text και SwiftUI για αναζήτηση και ρύθμιση γραμματοσειρών
  • Παρέχει αντιστοίχιση γραμματοσειράς — αυτόματη επιλογή της κοντινότερης διαθέσιμης κοπής

Τι είναι το Font Descriptor και γιατί χρειάζεται

Font Descriptor — είναι ένα αντικείμενο που περιγράφει τα χαρακτηριστικά της γραμματοσειράς ως ένα σύνολο ζευγών κλειδιού-τιμής, όχι ως ένα συγκεκριμένο αρχείο γραμματοσειράς. Αντί να δημιουργείτε γραμματοσειρά βάσει ονόματος, ο προγραμματιστής καθορίζει την οικογένεια, την κοπή, το μέγεθος και προαιρετικά γνωρίσματα, και το σύστημα επιλέγει την καλύτερη αντιστοιχία. Αυτή η προσέγγιση είναι κρίσιμη για την προσαρμοστική τυπογραφία: ο ίδιος περιγραφέας μπορεί να λειτουργήσει σε διαφορετικές εκδόσεις iOS όπου το σύνολο των διαθέσιμων γραμματοσειρών διαφέρει. Σύμφωνα με τις iOS Human Interface Guidelines, η αντιστοίχιση γραμματοσειρών μέσω περιγραφέων είναι ο συνιστώμενος τρόπος εργασίας με δυναμικές γραμματοσειρές.

Χωρίς το Font Descriptor, ο προγραμματιστής θα έπρεπε να ελέγχει τη διαθεσιμότητα κάθε γραμματοσειράς βάσει ονόματος και να καθορίζει χειροκίνητα τις εναλλακτικές επιλογές εφεδρείας. Ο περιγραφέας αυτοματοποιεί αυτή τη διαδικασία: περιέχει έναν πίνακα συμβατότητας κοπών — κανονική, έντονη, πλάγια, έντονη πλάγια — και σε περίπτωση απουσίας ακριβούς αντιστοίχου, επιστρέφει την κοντινότερη διαθέσιμη. Αντιστοίχιση συστήματος λειτουργεί σε επίπεδο Core Text και είναι διαθέσιμη τόσο σε iOS όσο και σε macOS μέσω του ενιαίου API NSFontDescriptor.

Οι περιγραφείς χρησιμοποιούνται επίσης για προσαρμοσμένες γραμματοσειρές — φορτωμένες μέσω Info.plist ή προστιθέμενες χειροκίνητα. Εάν μια γραμματοσειρά είναι καταχωρημένη στο σύστημα, ο περιγραφέας της δημιουργείται ακριβώς όπως για μια γραμματοσειρά συστήματος. Σημείωση διαφορετικών πλατφορμών: η έννοια του περιγραφέα υπάρχει επίσης στο Android μέσω Typeface.Builder, αλλά η υλοποίηση iOS μέσω UIFontDescriptor παρέχει σημαντικά περισσότερα γνωρίσματα — πάνω από 20 έναντι 5 στο Android.

Βασικές ιδιότητες και γνωρίσματα του Font Descriptor

UIFontDescriptor περιέχει γνωρίσματα ομαδοποιημένα στο λεξικό fontAttributes τύπου [UIFontDescriptor.AttributeName: Any]. Τα βασικά γνωρίσματα περιλαμβάνουν την οικογένεια γραμματοσειράς (family), το όνομα (name), το μέγεθος (size), την κοπή (traits), τον πίνακα μετασχηματισμού (matrix), το οπτικό μέγεθος (opticalSize) και το στυλ κειμένου (textStyle). Σύμφωνα με το Apple WWDC 2019 Session 227, η χρήση στυλ κειμένου — Dynamic Type — είναι υποχρεωτική για εφαρμογές συμβατές με προσβασιμότητα.

Το γνώρισμα traits — είναι ένα λεξικό που περιέχει συμβολικά χαρακτηριστικά: πάχος (UIFontWeightTrait), πλάγιο (UIFontSlantTrait), πλάτος (UIFontWidthTrait) και άλλα. Αυτές οι τιμές χρησιμοποιούνται από τον αντιστοιχιστή γραμματοσειρών για την επιλογή κοπής. Παράδειγμα, UIFontWeightTrait με τιμή 0.0 — κανονική κοπή, 0.3 — έντονη. Το σύστημα αντιστοιχίζει αυτόματα τις αριθμητικές τιμές σε διαθέσιμες παραλλαγές γραμματοσειράς.

Πρόσθετα γνωρίσματα περιλαμβάνουν featureSettings για λειτουργίες OpenType (συνδέσεις, kerning, αναλογίες αριθμών), visibleName για εμφάνιση στον χρήστη, matrix για συγγενείς μετασχηματισμούς γραμματοσειράς και cascadeList για καταρράκτες λίστες γραμματοσειρών εφεδρείας. Η πλήρης λίστα γνωρισμάτων καλύπτει σχεδόν όλα τα σενάρια τυπογραφίας σε iOS και macOS.

ΓνώρισμαΤύποςΠεριγραφή
UIFontDescriptorFamilyStringΟικογένεια γραμματοσειράς (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringΠλήρες όνομα γραμματοσειράς (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberΜέγεθος γραμματοσειράς σε στιγμές
UIFontDescriptorMatrixNSValueΣυγγενής πίνακας μετασχηματισμού
UIFontDescriptorTraits[String: Any]Συμβολικά χαρακτηριστικά κοπής
UIFontDescriptorTextStyleStringΣτυλ Dynamic Type (headline, body, caption)

Δημιουργία UIFont μέσω Font Descriptor σε Swift

Ο κύριος τρόπος εργασίας με το Font Descriptor στο iOS — η δημιουργία ενός περιγραφέα με επακόλουθη δημιουργία UIFont. Αυτή είναι η προτιμώμενη προσέγγιση όταν χρειάζεται να λάβετε μια γραμματοσειρά με συγκεκριμένα χαρακτηριστικά χωρίς να γνωρίζετε το ακριβές όνομα. Η διαδικασία αποτελείται από δύο βήματα: δημιουργία UIFontDescriptor μέσω αρχικοποιητή και κλήση της μεθόδου font(withSize:) στον περιγραφέα.

swift
import UIKit

// Δημιουργία περιγραφέα γραμματοσειράς για οικογένεια
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// Δημιουργία UIFont από περιγραφέα
let font = descriptor.font(withSize: 17)

Αυτή η προσέγγιση εγγυάται ότι το σύστημα θα επιλέξει την καλύτερη αντιστοιχία για την έντονη κοπή του SF Pro στην τρέχουσα συσκευή. Βασικό πλεονέκτημα — ο κώδικας δεν εξαρτάται από την έκδοση iOS: σε iOS 13 θα χρησιμοποιηθεί SF Pro, σε παλαιότερες εκδόσεις — Helvetica Neue ή η προκαθορισμένη γραμματοσειρά συστήματος.

Για τη δημιουργία γραμματοσειράς με δυναμικό μέγεθος, χρησιμοποιείται αρχικοποιητής με στυλ κειμένου και κλίμακα. Το Dynamic Type προσαρμόζει αυτόματα το μέγεθος στις ρυθμίσεις χρήστη:

swift
// Περιγραφέας Dynamic Type
let bodyDescriptor = UIFontDescriptor
    .preferredFontDescriptor(withTextStyle: .body)

// Κάντε τη γραμματοσειρά έντονη
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// Δημιουργία UIFont διατηρώντας το δυναμικό μέγεθος
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Σημαντικό: η μέθοδος withSymbolicTraits επιστρέφει έναν προαιρετικό περιγραφέα — εάν η ζητούμενη κοπή δεν είναι διαθέσιμη, επιστρέφει nil. Ελέγχετε πάντα τον προαιρετικό πριν από χρήση.

Τροποποίηση γνωρισμάτων μέσω προσθήκης και αντικατάστασης

Το Font Descriptor υποστηρίζει ένα αμετάβλητο μοντέλο — κάθε μέθοδος τροποποίησης επιστρέφει έναν νέο περιγραφέα με το τροποποιημένο γνώρισμα. Αυτό αντιστοιχεί σε σημασιολογία τιμής και κάνει τον κώδικα προβλέψιμο: ο αρχικός περιγραφέας δεν αλλάζει ποτέ. Οι κύριες μέθοδοι τροποποίησης: addingAttributes για προσθήκη γνωρισμάτων, withFace για αλλαγή κοπής, withSize για αλλαγή μεγέθους, withMatrix για συγγενή μετασχηματισμό.

Η μέθοδος addingAttributes — η πιο ευέλικτη. Δέχεται ένα λεξικό γνωρισμάτων και επιστρέφει έναν νέο περιγραφέα. Σε περίπτωση που τα κλειδιά συμπίπτουν, οι νέες τιμές αντικαθιστούν τις παλιές. Αυτό επιτρέπει τον συνδυασμό αλλαγών: προσθήκη βάρους, αλλαγή μεγέθους και ενεργοποίηση συνδέσεων με μία κλήση. Σύμφωνα με το Apple Technical Q&A QA1682, η addingAttributes είναι η συνιστώμενη μέθοδος για μαζική τροποποίηση μέσω επέκτασης.

Πρακτική εφαρμογή: δημιουργία γραμματοσειράς για μονόχωρο κείμενο σε επεξεργαστή κώδικα. Ο προγραμματιστής παίρνει τον περιγραφέα monospace συστήματος, προσθέτει μειωμένο βάρος για λεπτές γραμμές και αυξάνει το διάστημα γραμμάτων μέσω featureSettings. Αυτό δίνει πιο ευανάγνωστο κώδικα χωρίς φόρτωση ξεχωριστής γραμματοσειράς.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Προσθήκη προσαρμοσμένων γνωρισμάτων
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

let monoFont = UIFont(
    descriptor: customDescriptor,
    size: 14
)

Περιορισμός: δεν είναι δυνατή η τροποποίηση όλων των γνωρισμάτων μετά τη δημιουργία του περιγραφέα. Για παράδειγμα, η οικογένεια γραμματοσειράς (family) ορίζεται μία φορά κατά την αρχικοποίηση. Εάν πρέπει να αλλάξετε την οικογένεια, δημιουργήστε έναν νέο περιγραφέα. Αυτό οφείλεται στην αρχιτεκτονική του Core Text, όπου ο περιγραφέας είναι δεσμευμένος σε έναν συγκεκριμένο πόρο γραμματοσειράς.

Αντιστοίχιση γραμματοσειράς και αναζήτηση γραμματοσειρών συστήματος

Αντιστοίχιση γραμματοσειράς — η κύρια λειτουργία του Font Descriptor, η οποία επιλέγει αυτόματα την καλύτερη αντιστοιχία για τα ζητούμενα γνωρίσματα από τις εγκατεστημένες γραμματοσειρές. Η διαδικασία περιλαμβάνει τρία στάδια: φιλτράρισμα (αποκλεισμός ασύμβατων γραμματοσειρών), κατάταξη (ταξινόμηση βάσει βαθμού αντιστοιχίας) και επιλογή (επιστροφή του καλύτερου αποτελέσματος). Η αντιστοίχιση εκτελείται σε επίπεδο Core Text — το πλαίσιο που βρίσκεται στη βάση όλης της τυπογραφίας iOS.

Για την αναζήτηση όλων των γραμματοσειρών που αντιστοιχούν σε έναν περιγραφέα, χρησιμοποιείται η μέθοδος matchingFontDescriptors. Επιστρέφει μια σειρά περιγραφέων ταξινομημένων κατά σχετικότητα. Ο προγραμματιστής μπορεί να επιλέξει την ακριβή αντιστοιχία (πρώτο στοιχείο) ή να εξετάσει τις εναλλακτικές για προσαρμοσμένη λογική. Σύμφωνα με τον Apple Font Handling Guide, αυτός είναι ο μοναδικός τρόπος για να λάβετε τη λίστα των διαθέσιμων κοπών για μια συγκεκριμένη οικογένεια χωρίς απαρίθμηση βάσει ονόματος.

Σενάριο χρήσης: κατά την επιλογή γραμματοσειράς στη διεπαφή ρυθμίσεων κειμένου. Ο χρήστης επιλέγει μια οικογένεια, και η εφαρμογή μέσω matchingFontDescriptors λαμβάνει όλες τις διαθέσιμες κοπές και τις εμφανίζει σε ένα picker. Χωρίς αντιστοίχιση, θα πρέπει να κωδικοποιήσετε σκληρά τη λίστα παραλλαγών που αλλάζει μεταξύ εκδόσεων iOS.

swift
let searchDescriptor = UIFontDescriptor.init(
    fontAttributes: [.family: "SF Mono"]
)

// Λήψη όλων των διαθέσιμων κοπών
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

for descriptor in matchingDescriptors {
    print(descriptor.object(forKey: .visibleName) ?? "unnamed")
}

Mandatory keys — παράμετρος που περιορίζει την αναζήτηση. Εάν οριστεί [.family], η αντιστοίχιση θα επιστρέψει όλες τις γραμματοσειρές της καθορισμένης οικογένειας. Εάν οριστεί [.family, .traits] — μόνο όσες ταιριάζουν και σε οικογένεια και σε κοπή. Η χρήση mandatory keys επιταχύνει την αντιστοίχιση κατά την αναζήτηση υποσυνόλου γραμματοσειρών.

Απόδοση: η αντιστοίχιση είναι μια σύγχρονη λειτουργία που διαρκεί από 0.5 έως 5 ms σε iOS. Για μια μεμονωμένη αναζήτηση αυτό είναι απαρατήρητο, αλλά κατά τη μαζική εξέταση περιγραφέων (π.χ. σε picker με 50+ γραμματοσειρές) συνιστάται η προσωρινή αποθήκευση αποτελεσμάτων. Η Apple συνιστά να εκτελείτε την αντιστοίχιση μία φορά κατά τη φόρτωση της οθόνης και να αποθηκεύετε τη σειρά περιγραφέων.

Ενσωμάτωση με Core Text και CTFontDescriptor

Core Text — είναι ένα πλαίσιο C χαμηλού επιπέδου για εργασία με τυπογραφία σε iOS και macOS. Το αντίστοιχο του UIFontDescriptor — CTFontDescriptor, που παρέχει τις ίδιες δυνατότητες σε επίπεδο Core Foundation. Το CTFontDescriptor χρησιμοποιείται στο API Core Text για δημιουργία γραμματοσειρών, μέτρηση κειμένου και απόδοση σύνθετης τυπογραφίας. Το UIFontDescriptor είναι ουσιαστικά ένα περίβλημα Objective-C γύρω από το CTFontDescriptor με εκτεταμένο σύνολο γνωρισμάτων.

Το Toll-free bridging μεταξύ UIFontDescriptor και CTFontDescriptor επιτρέπει τη μεταφορά περιγραφέων μεταξύ UIKit και Core Text χωρίς μετατροπή. Αυτό είναι κρίσιμο για εφαρμογές που χρησιμοποιούν προσαρμοσμένη απόδοση κειμένου — για παράδειγμα, επεξεργαστές κειμένου βασισμένους σε TextKit ή επεξεργαστές κώδικα με επισήμανση σύνταξης. Παράδειγμα: το CTFontDescriptorCreateCopyWithAttribute δημιουργεί ένα αντίγραφο του περιγραφέα με προστιθέμενο γνώρισμα — το αντίστοιχο της addingAttributes από το UIFontDescriptor.

Key attribute kCTFontURLAttribute στο CTFontDescriptor περιέχει το URL του αρχείου γραμματοσειράς. Αυτό επιτρέπει να προσδιοριστεί εάν η γραμματοσειρά είναι συστήματος ή προσαρμοσμένη. Για προσαρμοσμένες γραμματοσειρές, το URL οδηγεί στο αρχείο γραμματοσειράς (.ttf ή .otf), για γραμματοσειρές συστήματος — στον κατάλογο γραμματοσειρών συστήματος. Τα δεδομένα μέσω του περιγραφέα είναι μόνο για ανάγνωση· η τροποποίηση του αρχείου γραμματοσειράς μέσω URL δεν υποστηρίζεται.

Για προηγμένη τυπογραφία — προσαρμοσμένες συνδέσεις, συμφραζόμενες αντικαταστάσεις, εναλλακτικές γλύφες — χρησιμοποιείται CTFontDescriptorCopyAttribute με το κλειδί kCTFontFeatureSettingsAttribute. Αυτό το γνώρισμα περιέχει μια σειρά λεξικών λειτουργιών OpenType που μπορούν να προστεθούν μέσω του περιγραφέα. Σύμφωνα με τον Apple Core Text Programming Guide, ο συνδυασμός UIFontDescriptor με Core Text παρέχει πλήρη έλεγχο επί της τυπογραφίας της εφαρμογής.

Συχνές ερωτήσεις

Σε τι διαφέρει το Font Descriptor από το UIFont;

UIFont — είναι μια έτοιμη προς χρήση γραμματοσειρά που αποδίδει κείμενο. Το Font Descriptor — είναι μια περιγραφή γραμματοσειράς, ένα σύνολο γνωρισμάτων από τα οποία μπορεί να δημιουργηθεί UIFont. Ένας περιγραφέας μπορεί να δημιουργήσει πολλαπλά UIFont διαφορετικών μεγεθών.

Μπορεί το Font Descriptor να χρησιμοποιηθεί για προσαρμοσμένες γραμματοσειρές;

Ναι. Εάν η γραμματοσειρά είναι καταχωρημένη στο σύστημα (μέσω Info.plist ή Core Graphics), ο περιγραφέας της δημιουργείται κατά οικογένεια ή όνομα ακριβώς όπως για τις γραμματοσειρές συστήματος. Η αντιστοίχιση λειτουργεί για όλες τις καταχωρημένες γραμματοσειρές.

Πώς να λάβετε το όνομα γραμματοσειράς από τον περιγραφέα;

Χρησιμοποιήστε descriptor.object(forKey: .visibleName) για το εμφανιζόμενο όνομα ή descriptor.postscriptName για το όνομα PostScript. Το όνομα PostScript χρησιμοποιείται κατά τη δημιουργία γραμματοσειράς μέσω UIFont(name:size:).

Τι είναι το cascade list στο Font Descriptor;

Cascade list — είναι μια σειρά ένθετων περιγραφέων που χρησιμεύουν ως γραμματοσειρές εφεδρείας. Εάν η κύρια γραμματοσειρά δεν περιέχει τον απαιτούμενο χαρακτήρα, το σύστημα ελέγχει διαδοχικά τις γραμματοσειρές από το cascade list. Χρησιμοποιείται για υποστήριξη emoji και χαρακτήρων CJK.

Λειτουργεί το Font Descriptor στο SwiftUI;

Ναι. Το SwiftUI υποστηρίζει το Font Descriptor μέσω Font(descriptor:size:). Το περίβλημα SwiftUI δέχεται ένα UIFontDescriptor και δημιουργεί μια γραμματοσειρά SwiftUI, διατηρώντας όλα τα γνωρίσματα του περιγραφέα — kerning, συνδέσεις και κοπή.

Σύνοψη

  • Font Descriptor — αντικείμενο περιγραφής γραμματοσειράς με γνωρίσματα οικογένειας, κοπής, μεγέθους και τυπογραφικών χαρακτηριστικών
  • Επιτρέπει τη δημιουργία UIFont από ένα σύνολο γνωρισμάτων με αυτόματη αντιστοίχιση γραμματοσειράς
  • Υποστηρίζει αμετάβλητη τροποποίηση μέσω addingAttributes, withSize, withSymbolicTraits
  • matchingFontDescriptors επιστρέφει όλες τις διαθέσιμες κοπές για αναζήτηση και επιλογή γραμματοσειράς
  • Ενσωματώνεται με Core Text μέσω toll-free bridging μεταξύ UIFontDescriptor και CTFontDescriptor
  • Υποστηρίζει Dynamic Type μέσω προτιμώμενων στυλ κειμένου και κλιμάκωσης
  • Συνιστάται για προσαρμοστική τυπογραφία που υποστηρίζει όλες τις εκδόσεις iOS χωρίς έλεγχο διαθεσιμότητας γραμματοσειράς

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης