Attributed Text είναι ένας μηχανισμός του iOS SDK, που αντιπροσωπεύεται από τις κλάσεις NSAttributedString και NSMutableAttributedString, ο οποίος επιτρέπει την εφαρμογή πολλαπλών στυλ σε διαφορετικά τμήματα μιας συμβολοσειράς κειμένου. Σε αντίθεση με το συνηθισμένο NSString, το Attributed String αποθηκεύει όχι μόνο χαρακτήρες αλλά και ένα λεξικό χαρακτηριστικών για κάθε εύρος: γραμματοσειρά, χρώμα, διάστιχο, σκιά και στοίχιση. Σύμφωνα με το Apple Developer Documentation, το Attributed String αποτελεί τη βάση για την εμφάνιση μορφοποιημένου κειμένου σε UILabel, UITextView και UITextField. Είναι ο τυπικός τρόπος στυλιζαρίσματος κειμένου χωρίς WebKit ή βιβλιοθήκες τρίτων.
Κύρια σημεία
NSAttributedString είναι μια κλάση του πλαισίου Foundation που αντιπροσωπεύει μια συμβολοσειρά με ένα σύνολο ονομασμένων χαρακτηριστικών συνδεδεμένων σε εύρη χαρακτήρων. Κάθε χαρακτηριστικό είναι ένα ζεύγος κλειδιού-τιμής: το κλειδί ορίζεται από μια σταθερά (NSFontAttributeName, NSForegroundColorAttributeName) και η τιμή από ένα αντίστοιχο αντικείμενο (UIFont, UIColor). Τα χαρακτηριστικά εφαρμόζονται σε ένα εύρος χαρακτήρων μέσω NSRange.
Η κλάση είναι διαθέσιμη σε όλες τις πλατφόρμες Apple: iOS (2.0+), macOS, tvOS, watchOS. Το NSAttributedString είναι αμετάβλητο — μετά τη δημιουργία, τα χαρακτηριστικά του είναι σταθερά. Για δυναμική αλλαγή χρησιμοποιείται το NSMutableAttributedString, το οποίο κληρονομεί το NSAttributedString και προσθέτει τις μεθόδους setAttributes, addAttributes, addAttribute, removeAttribute.
NSString είναι μια απλή συμβολοσειρά χαρακτήρων χωρίς πληροφορίες στυλ. Οποιοδήποτε κείμενο μεταβιβαστεί στο UILabel μέσω text εμφανίζεται με μία γραμματοσειρά, χρώμα και μέγεθος. Το NSAttributedString που μεταβιβάζεται μέσω attributedText επιτρέπει σε κάθε χαρακτήρα να έχει το δικό του σύνολο χαρακτηριστικών. Τα UILabel, UITextView και UITextField αναγνωρίζουν αυτόματα το NSAttributedString και αποδίδουν το κείμενο σύμφωνα με τα χαρακτηριστικά.
Εσωτερικά, το NSAttributedString αποθηκεύει ένα NSString με το κείμενο και έναν πίνακα ευρών χαρακτηριστικών. Κάθε εύρος αντιπροσωπεύεται από μια δομή NSRange και ένα λεξικό χαρακτηριστικών. Κατά την απόδοση, το σύστημα διατρέχει τα εύρη και εφαρμόζει τα αντίστοιχα χαρακτηριστικά σε κάθε τμήμα. Η αποδοτικότητα εξαρτάται από τον αριθμό εναλλαγών χαρακτηριστικών — οι συχνές αλλαγές σε σύντομα τμήματα αυξάνουν τον χρόνο απόδοσης.
Χαρακτηριστικά NSAttributedString είναι σταθερές που ορίζονται στο UIKit (iOS) και AppKit (macOS), κάθε μία από τις οποίες αντιστοιχεί σε μια συγκεκριμένη πτυχή της οπτικής μορφοποίησης κειμένου. Όλα τα χαρακτηριστικά είναι συμβολοσειρές NSAttributedString.Key και οι τιμές τους είναι αντικείμενα συγκεκριμένων κλάσεων. Τα χαρακτηριστικά χωρίζονται σε χαρακτηριστικά χαρακτήρων (επηρεάζουν τους χαρακτήρες) και χαρακτηριστικά παραγράφων (επηρεάζουν τις παραγράφους).
Τα χαρακτηριστικά χαρακτήρων περιλαμβάνουν γραμματοσειρά (NSFontAttributeName), χρώμα κειμένου (NSForegroundColorAttributeName), χρώμα φόντου (NSBackgroundColorAttributeName), υπογράμμιση (NSUnderlineStyleAttributeName), διαγραφή (NSStrikethroughStyleAttributeName), σκιά (NSShadowAttributeName). Τα χαρακτηριστικά παραγράφου ορίζονται μέσω NSParagraphStyleAttributeName, το οποίο ελέγχει τη στοίχιση, τις εσοχές, το διάστιχο και τη στοίχιση στηλών.
NSLinkAttributeName δημιουργεί έναν κλικ-able σύνδεσμο στο κείμενο: η τιμή είναι ένα URL ή συμβολοσειρά. Το UITextView επεξεργάζεται αυτόματα τέτοιους συνδέσμους εάν η αλληλεπίδραση είναι ενεργοποιημένη. Το NSAttachmentAttributeName επιτρέπει την ενσωμάτωση NSTextAttachment — μιας εικόνας μέσα στο κείμενο που εμφανίζεται ως inline στοιχείο. Αυτό χρησιμοποιείται για τη δημιουργία κειμένου με εικονίδια, emoji ή προσαρμοσμένες προβολές εντός της συμβολοσειράς.
Κάθε χαρακτηριστικό NSAttributedString έχει μια αυστηρά τυποποιημένη τιμή. Ας δούμε τα πιο συχνά χρησιμοποιούμενα χαρακτηριστικά στην ανάπτυξη iOS. Η γραμματοσειρά ορίζεται από ένα αντικείμενο UIFont, το χρώμα από UIColor, το διάστιχο μέσω NSMutableParagraphStyle, το οποίο επιτρέπει τη ρύθμιση της στοίχισης, των εσοχών και των αποστάσεων σε ένα αντικείμενο.
| Κλειδί χαρακτηριστικού | Τύπος τιμής | Σκοπός |
|---|---|---|
| NSFontAttributeName | UIFont | Γραμματοσειρά κειμένου |
| NSForegroundColorAttributeName | UIColor | Χρώμα κειμένου |
| NSBackgroundColorAttributeName | UIColor | Χρώμα φόντου κάτω από το κείμενο |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Στυλ υπογράμμισης |
| NSParagraphStyleAttributeName | NSParagraphStyle | Ρυθμίσεις παραγράφου |
| NSKernAttributeName | NSNumber (Float) | Διάστιχο μεταξύ γραμμάτων |
NSParagraphStyle είναι ένα δοχείο για χαρακτηριστικά παραγράφου: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight και άλλα. Για να αλλάξετε αυτές τις παραμέτρους, δημιουργείται ένα NSMutableParagraphStyle, ρυθμίζονται οι επιθυμητές ιδιότητες και το αντικείμενο μεταβιβάζεται ως τιμή του χαρακτηριστικού NSParagraphStyleAttributeName. Αυτός είναι ο μόνος τρόπος ελέγχου του διάστιχου στο NSAttributedString.
NSShadow επιτρέπει την προσθήκη σκιάς στο κείμενο: οι παράμετροι shadowOffset, shadowBlurRadius, shadowColor ορίζουν τη μετατόπιση, τη θόλωση και το χρώμα της σκιάς. Τα χαρακτηριστικά υπογράμμισης και διαγραφής δέχονται συνδυασμούς στυλ: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Για ακριβή έλεγχο του πάχους και του χρώματος των γραμμών χρησιμοποιούνται τα NSUnderlineColorAttributeName και NSStrikethroughColorAttributeName.
Η δημιουργία ενός NSAttributedString στη Swift γίνεται μέσω αρχικοποιητή με καθορισμό κειμένου και λεξικού χαρακτηριστικών, ή μέσω NSMutableAttributedString με σταδιακή εφαρμογή στυλ. Η βασική προσέγγιση — ορισμός ενός λεξικού χαρακτηριστικών για ολόκληρο το κείμενο, στη συνέχεια προσθήκη ή αλλαγή χαρακτηριστικών για μεμονωμένα εύρη.
Ένα απλό παράδειγμα — ορισμός γραμματοσειράς, χρώματος και στοίχισης για ολόκληρη τη συμβολοσειρά. Το λεξικό χαρακτηριστικών μεταβιβάζεται στον αρχικοποιητή NSAttributedString. Τα κλειδιά του λεξικού είναι σταθερές NSAttributedString.Key, οι τιμές είναι αντίστοιχα αντικείμενα UIKit. Αυτή είναι η βασική παραλλαγή όταν ολόκληρο το κείμενο μορφοποιείται ομοιόμορφα.
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.darkGray,
.paragraphStyle: let style = NSMutableParagraphStyle()
style.alignment = .center
style.lineSpacing = 4
return style
]
let attributedString = NSAttributedString(
string: "Hello world",
attributes: attributes
)
label.attributedText = attributedString
Το κείμενο θα εμφανιστεί με γραμματοσειρά systemFont 16, σκούρο γκρι χρώμα, στοίχιση στο κέντρο και διάστιχο 4pt. Αυτή η προσέγγιση είναι βολική για στατικές επικεφαλίδες και κουμπιά.
NSMutableAttributedString επιτρέπει την εφαρμογή διαφορετικών στυλ σε διαφορετικά τμήματα κειμένου. Η μέθοδος addAttribute προσθέτει ένα χαρακτηριστικό σε ένα εύρος, addAttributes — ένα λεξικό χαρακτηριστικών. Η μέθοδος setAttributes αντικαθιστά όλα τα χαρακτηριστικά του εύρους με νέα. Αυτό είναι το κύριο εργαλείο για τη δημιουργία κειμένου με επισημάνσεις.
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed
Η λέξη “1999” θα είναι πράσινη και έντονη, το υπόλοιπο κείμενο — κανονικό. Το NSRange υπολογίζεται χειροκίνητα — είναι σημαντικό να μετράτε σωστά το μήκος σε χαρακτήρες, ειδικά όταν εργάζεστε με emoji και σύνθετους χαρακτήρες Unicode.
NSMutableAttributedString παρέχει μεθόδους για δυναμική αλλαγή κειμένου και χαρακτηριστικών: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Αυτό επιτρέπει τη δημιουργία κειμένου από διαφορετικές πηγές, τον συνδυασμό στυλ και την ανταπόκριση σε γεγονότα διεπαφής.
Σε αντίθεση με το αμετάβλητο NSAttributedString, η mutable έκδοση υποστηρίζει αλλαγή περιεχομένου χωρίς δημιουργία νέου αντικειμένου. Αυτό είναι κρίσιμο για επεξεργαστές κειμένου, συνομιλίες και φόρμες, όπου ο χρήστης μπορεί να επεξεργαστεί το κείμενο και τα στυλ πρέπει να διατηρηθούν.
Στις εφαρμογές ανταλλαγής μηνυμάτων, κάθε μήνυμα περιέχει όνομα χρήστη (έντονη γραμματοσειρά), κείμενο μηνύματος (κανονικό), ώρα(γκρι χρώμα). Το NSMutableAttributedString επιτρέπει τη δημιουργία μιας τέτοιας συμβολοσειράς με μία κίνηση, προσθέτοντας τμήματα στη σωστή σειρά με τα κατάλληλα χαρακτηριστικά.
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result
Το αποτέλεσμα — μία συμβολοσειρά με τρία τμήματα διαφορετικών στυλ. Το Append υπολογίζει αυτόματα σωστά το NSRange, οι θέσεις δεν χρειάζεται να υπολογίζονται χειροκίνητα. Αυτή η προσέγγιση κλιμακώνεται σε οποιονδήποτε αριθμό τμημάτων.
Η μέθοδος enumerateAttributes(in:options:using:) διατρέχει όλα τα εύρη χαρακτηριστικών στο καθορισμένο διάστημα. Αυτό είναι χρήσιμο για ανάλυση μορφοποίησης: εύρεση όλων των συνδέσμων, αλλαγή χρώματος συγκεκριμένων χαρακτηριστικών ή εξαγωγή κειμένου σε HTML. Στο κλείσιμο μεταβιβάζονται το λεξικό χαρακτηριστικών και το NSRange του τρέχοντος τμήματος.
Όλα τα βασικά στοιχεία UI για εμφάνιση κειμένου στο UIKit υποστηρίζουν NSAttributedString μέσω της ιδιότητας attributedText. Το UILabel εμφανίζει στατικό στυλιζαρισμένο κείμενο, το UITextView υποστηρίζει επεξεργασία και συνδέσμους, το UITextField δέχεται χαρακτηριστικά ξεχωριστά για το placeholder και το εισαγόμενο κείμενο.
UILabel είναι το ελαφρύτερο στοιχείο για εμφάνιση στυλιζαρισμένου κειμένου. Υποστηρίζει όλα τα χαρακτηριστικά χαρακτήρων, αλλά δεν επεξεργάζεται αυτόματα κλικ-able συνδέσμους (για αυτό απαιτείται UITextView). Το UILabel είναι ιδανικό για επικεφαλίδες, ετικέτες και σύντομα κείμενα με μορφοποίηση.
UITextView επεξεργάζεται το NSLinkAttributeName και εμφανίζει συνδέσμους ως διαδραστικά στοιχεία. Για να ενεργοποιήσετε αυτή τη λειτουργία, ορίστε isSelectable = true και isEditable = false. Όταν γίνει κλικ σε έναν σύνδεσμο, ο εκπρόσωπος λαμβάνει την κλήση textView(_:shouldInteractWith:in:interaction:). Το UITextView υποστηρίζει επίσης NSTextAttachment για εικόνες μέσα στο κείμενο.
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
value: URL(string: "https://developer.apple.com")!,
range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false
Μετά τη ρύθμιση των isSelectable και isEditable, η περιοχή κειμένου συμπεριφέρεται ως στατικό μπλοκ κειμένου, αλλά οι σύνδεσμοι παραμένουν ενεργοί. Ο εκπρόσωπος UITextViewDelegate διαχειρίζεται τη συμπεριφορά κατά το κλικ.
Core Text είναι ένα χαμηλού επιπέδου πλαίσιο της Apple για απόδοση κειμένου που λειτουργεί άμεσα με το NSAttributedString. Σε αντίθεση με το UIKit, το Core Text δεν χρησιμοποιεί το NSAttributedString άμεσα ως αντικείμενο προς εμφάνιση, αλλά το μετατρέπει σε CTFramesetter, στη συνέχεια σε CTFrame και το αποδίδει σε ένα πλαίσιο Core Graphics. Αυτό δίνει πλήρη έλεγχο επί της τοποθέτησης γραμμών και γλυφών.
Η χρήση του Core Text δικαιολογείται για προσαρμοσμένες διατάξεις κειμένου: στήλες, ροή γύρω από εικόνες, περιστροφή κειμένου, μη τυπικές αλλαγές γραμμών. Το NSMutableParagraphStyle του Core Text περιλαμβάνει χαρακτηριστικά που δεν υπάρχουν στο UIKit: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode με πρόσθετες λειτουργίες.
NSAttributedString μεταφέρεται απρόσκοπτα μεταξύ UIKit και Core Text, καθώς και τα δύο πλαίσια λειτουργούν με τον ίδιο τύπο. Τα χαρακτηριστικά UIKit (NSFontAttributeName, NSForegroundColorAttributeName) αναγνωρίζονται αυτόματα από το Core Text και αντίστροφα — τα χαρακτηριστικά Core Text (kCTFontAttributeName) διαβάζονται από το UIKit. Αυτό επιτρέπει τη χρήση UIKit για απλές εργασίες και Core Text για προσαρμοσμένη απόδοση στο ίδιο αντικείμενο NSAttributedString.
Συχνές ερωτήσεις
NSString αποθηκεύει μόνο κείμενο χωρίς πληροφορίες στυλ. Το NSAttributedString συμπληρώνει το κείμενο με ένα λεξικό χαρακτηριστικών για κάθε εύρος χαρακτήρων. Όταν μεταβιβάζεται στο UILabel μέσω της ιδιότητας text, το NSString εμφανίζεται ως απλό κείμενο. Όταν μεταβιβάζεται το NSAttributedString μέσω της ιδιότητας attributedText, εφαρμόζονται όλα τα χαρακτηριστικά: διαφορετικές γραμματοσειρές, χρώματα και αποστάσεις σε μία συμβολοσειρά.
Χρησιμοποιήστε τη μέθοδο addAttributes(_:range:) με ένα λεξικό χαρακτηριστικών: addAttributes([.font: font, .foregroundColor: color], range: range). Για να προσθέσετε ή να αλλάξετε ένα χαρακτηριστικό, χρησιμοποιήστε addAttribute(_:value:range:). Η μέθοδος setAttributes αντικαθιστά όλα τα υπάρχοντα χαρακτηριστικά στο εύρος με νέα.
Δημιουργήστε ένα NSMutableParagraphStyle, ορίστε την ιδιότητα lineSpacing και στη συνέχεια μεταβιβάστε το ως τιμή του χαρακτηριστικού NSParagraphStyleAttributeName. Για πλήρη έλεγχο, διατίθενται επίσης minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode και alignment. Το ParagraphStyle είναι ο μόνος τρόπος ελέγχου του διάστιχου.
Ναι, το SwiftUI υποστηρίζει NSAttributedString μέσω Text(attributedString:) στο iOS 15+. Σε παλαιότερες εκδόσεις, χρησιμοποιήστε UIViewRepresentable με UILabel ή UITextView. Το SwiftUI παρέχει επίσης τον δικό του τύπο AttributedString (SwiftUI, όχι Foundation) για δηλωτική μορφοποίηση με σύνταξη παρόμοια με Markdown.
Χρησιμοποιήστε τη μέθοδο boundingRect(with:options:context:), η οποία επιστρέφει το CGRect που απαιτείται για την εμφάνιση της συμβολοσειράς με τα καθορισμένα χαρακτηριστικά. Η παράμετρος options: [.usesLineFragmentOrigin, .usesFontLeading] λαμβάνει υπόψη τα διάστιχα και τις μετρικές γραμματοσειράς. Για UILabel με περιορισμένο αριθμό γραμμών, χρησιμοποιήστε sizeThatFits.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης