NSAttributedString — είναι μια κλάση από το Foundation framework στο iOS SDK που αναπαριστά μια συμβολοσειρά με ένα σύνολο ιδιοτήτων μορφοποίησης που εφαρμόζονται σε μεμονωμένους χαρακτήρες ή περιοχές κειμένου. Σε αντίθεση με το συνηθισμένο NSString, το NSAttributedString αποθηκεύει όχι μόνο χαρακτήρες Unicode, αλλά και ένα λεξικό ιδιοτήτων (γραμματοσειρά, χρώμα, διάστημα μεταξύ χαρακτήρων, στοίχιση) για κάθε τμήμα της συμβολοσειράς. Σύμφωνα με την Apple Developer Documentation (2026), το NSAttributedString αποτελεί τη βάση για την εμφάνιση μορφοποιημένου κειμένου σε όλα τα UI στοιχεία του iOS.
Κύρια σημεία
NSAttributedString — είναι μια θεμελιώδης κλάση iOS/macOS για εργασία με μορφοποιημένο κείμενο. Επεκτείνει τις δυνατότητες του NSString προσθέτοντας ιδιότητες στη συμβολοσειρά — ένα λεξικό ζευγών κλειδιού-τιμής, όπου το κλειδί είναι μια σταθερά NSAttributedStringKey (π.χ., .font, .foregroundColor) και η τιμή είναι το αντίστοιχο αντικείμενο (UIFont, UIColor). Κάθε χαρακτήρας στη συμβολοσειρά μπορεί να έχει το δικό του σύνολο ιδιοτήτων, επιτρέποντας μικτή μορφοποίηση σε μία συμβολοσειρά.
Η αρχιτεκτονική του NSAttributedString βασίζεται στην έννοια των περιοχών ιδιοτήτων (attribute runs). Εάν ορίσετε την ιδιότητα .font = UIFont.boldSystemFont(ofSize: 16) για την περιοχή χαρακτήρων 0..5, όλοι οι χαρακτήρες αυτής της περιοχής θα εμφανιστούν με έντονη γραμματοσειρά. Οι υπόλοιποι χαρακτήρες μπορεί να έχουν διαφορετική γραμματοσειρά ή να μην έχουν καθόλου ιδιότητα. Κατά την εμφάνιση μιας συμβολοσειράς με ιδιότητες, το σύστημα UIKit συνδυάζει χαρακτηριστικά από διαφορετικές περιοχές και αποδίδει το κείμενο ομοιόμορφα.
Το NSAttributedString είναι αμετάβλητο — μετά τη δημιουργία, οι ιδιότητες και το περιεχόμενό του δεν μπορούν να τροποποιηθούν. Για τροποποίηση υπάρχει η υποκλάση NSMutableAttributedString, η οποία παρέχει μεθόδους για προσθήκη, διαγραφή και τροποποίηση ιδιοτήτων σε οποιεσδήποτε περιοχές. Αυτή η διαφορά είναι σημαντική για πολυνηματικότητα: το αμετάβλητο NSAttributedString είναι thread-safe, ενώ το NSMutableAttributedString δεν είναι.
NSAttributedString υποστηρίζει περίπου 40 τυπικές ιδιότητες που ορίζονται στο NSAttributedStringKey. Κάθε ιδιότητα επηρεάζει μια συγκεκριμένη πτυχή της εμφάνισης του κειμένου: γραμματοσειρά, χρώμα, θέση, υπογράμμιση, σκιά, διάστημα μεταξύ χαρακτήρων, στυλ παραγράφου και υπερσυνδέσμους. Για να ορίσετε μια ιδιότητα, χρησιμοποιείται η σταθερά NSAttributedStringKey και της εκχωρείται ένα αντικείμενο του αντίστοιχου τύπου.
| Κλειδί ιδιότητας | Τύπος τιμής | Σκοπός |
|---|---|---|
| .font | UIFont | Γραμματοσειρά και μέγεθος κειμένου |
| .foregroundColor | UIColor | Χρώμα κειμένου |
| .backgroundColor | UIColor | Χρώμα φόντου κάτω από το κείμενο |
| .paragraphStyle | NSParagraphStyle | Στοίχιση, διάστημα γραμμών, εσοχές |
| .kern | NSNumber (Float) | Διάστημα μεταξύ χαρακτήρων (kerning) |
| .underlineStyle | NSUnderlineStyle (Int) | Στυλ υπογράμμισης (single, double, thick, pattern) |
| .strikethroughStyle | NSUnderlineStyle (Int) | Στυλ διαγραφής |
| .link | NSURL | URL για διαδραστικό υπερσύνδεσμο |
| .shadow | NSShadow | Σκιά κειμένου με offset, blurRadius και χρώμα |
| .baselineOffset | NSNumber (Float) | Μετατόπιση κειμένου σε σχέση με τη γραμμή βάσης |
NSMutableParagraphStyle — αντικείμενο που διαχειρίζεται τα οπτικά χαρακτηριστικά της παραγράφου: στοίχιση (.alignment: .left, .center, .right, .justified), διάστημα γραμμών (.lineSpacing), απόσταση μεταξύ παραγράφων (.paragraphSpacing), εσοχή πρώτης γραμμής (.firstLineHeadIndent), αριστερή και δεξιά εσοχή (.headIndent, .tailIndent) και κατεύθυνση κειμένου (.baseWritingDirection). Το ParagraphStyle εφαρμόζεται στην περιοχή που περιλαμβάνει χαρακτήρες νέας γραμμής, εάν απαιτείται η ίδια μορφοποίηση για ολόκληρη την παράγραφο.
Δημιουργία Το NSAttributedString γίνεται μέσω αρχικοποιητή που δέχεται μια συμβολοσειρά και ένα λεξικό ιδιοτήτων. Οι ιδιότητες εφαρμόζονται σε ολόκληρη τη συμβολοσειρά. Για μικτή μορφοποίηση (διαφορετικές ιδιότητες σε διαφορετικά μέρη της συμβολοσειράς) χρησιμοποιείται NSMutableAttributedString με επακόλουθη προσθήκη ιδιοτήτων σε συγκεκριμένες περιοχές. Objective-C χρησιμοποιεί το λεξικό NSAttributedStringKey: UIFont, ενώ το Swift χρησιμοποιεί το type-safe λεξικό [NSAttributedString.Key: Any].
let plainText = "Hello, Swift!"
// Create with uniform attributes for the entire string
let attributes: [NSAttributedString.Key: Any] = [
NSAttributedString.Key.font:
UIFont.systemFont(ofSize: 18),
NSAttributedString.Key.foregroundColor:
UIColor.darkText,
NSAttributedString.Key.kern: 1.5
]
let attributedString =
NSAttributedString(string: plainText,
attributes: attributes)
Το παράδειγμα δείχνει μορφοποίηση παραγράφου μέσω NSMutableParagraphStyle. Ορίζεται κεντρική στοίχιση, διάστημα γραμμών 8 στιγμών, απόσταση μετά την παράγραφο 12 στιγμών. Το ParagraphStyle προστίθεται στο λεξικό ιδιοτήτων υπό το κλειδί .paragraphStyle. NSAttributedString αντιγράφει το μεταδιδόμενο paragraphStyle, επομένως μετά τη δημιουργία της συμβολοσειράς μπορεί να τροποποιηθεί χωρίς να επηρεάσει την ήδη δημιουργημένη συμβολοσειρά.
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.center
paragraphStyle.lineSpacing = 8.0
paragraphStyle.paragraphSpacing = 12.0
paragraphStyle.firstLineHeadIndent = 20.0
let attributed = NSAttributedString(
string: "Centered paragraph with spacing",
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
NSMutableAttributedString — είναι μια υποκλάση του NSAttributedString που επιτρέπει την τροποποίηση περιεχομένου και ιδιοτήτων μετά τη δημιουργία. Κύριες μέθοδοι: addAttribute(_:value:range:) για προσθήκη μιας ιδιότητας σε μια περιοχή; addAttributes(_:range:) για προσθήκη πολλαπλών ιδιοτήτων; setAttributes(_:range:) για αντικατάσταση όλων των ιδιοτήτων σε μια περιοχή; removeAttribute(_:range:) για διαγραφή μιας ιδιότητας; replaceCharacters(in:with:) για αντικατάσταση κειμένου.
addAttribute και addAttributes προσθέτουν ιδιότητες στις υπάρχουσες, χωρίς να διαγράφουν τις ήδη ορισμένες. Εάν στην περιοχή υπάρχει ήδη ιδιότητα με το ίδιο κλειδί, η τιμή της αντικαθίσταται. setAttributes αντικαθιστά πλήρως το λεξικό ιδιοτήτων για την περιοχή — όλες οι προηγουμένως ορισμένες ιδιότητες διαγράφονται. Αυτό είναι σημαντικό κατά τη σειριακή μορφοποίηση μιας συμβολοσειράς: το addAttributes είναι ασφαλέστερο επειδή δεν επαναφέρει τις ήδη ορισμένες γραμματοσειρές και χρώματα.
Περιοχές (NSRange) ορίζονται με τη δομή NSRange(location: 0, length: 5). location — αρχικό ευρετήριο (με βάση το 0), length — αριθμός χαρακτήρων. Εάν η περιοχή υπερβαίνει τα όρια της συμβολοσειράς, το NSMutableAttributedString δημιουργεί εξαίρεση NSRangeException. Για ασφαλή εργασία με περιοχές, χρησιμοποιούνται οι μέθοδοι NSRange από το Foundation, όπως NSIntersectionRange και NSUnionRange.
let attributed = NSMutableAttributedString(
string: "Bold and red text here")
// Apply bold font to first 9 characters
let boldRange = NSRange(location: 0, length: 9)
attributed.addAttribute(
NSAttributedString.Key.font,
value: UIFont.boldSystemFont(ofSize: 16),
range: boldRange)
// Apply red color to characters 13-16 ("text")
let redRange = NSRange(location: 13, length: 4)
attributed.addAttribute(
NSAttributedString.Key.foregroundColor,
value: UIColor.red,
range: redRange)
// Apply underline to the entire string
let fullRange = NSRange(location: 0,
length: attributed.length)
attributed.addAttribute(
NSAttributedString.Key.underlineStyle,
value: NSUnderlineStyle.single.rawValue,
range: fullRange)
Ο πιο συνηθισμένος τρόπος εμφάνισης NSAttributedString — ανάθεσή του στην ιδιότητα attributedText του UILabel. Σε αντίθεση με την ιδιότητα text, το attributedText χρησιμοποιεί ιδιότητες για απόδοση, υποστηρίζοντας μικτή μορφοποίηση. Σημαντικό: εάν έχει οριστεί attributedText, το UILabel αγνοεί τις ιδιότητες font, textColor, textAlignment — όλα τα οπτικά χαρακτηριστικά προέρχονται από τις ιδιότητες του NSAttributedString.
let label = UILabel()
label.numberOfLines = 0
let fullText = NSMutableAttributedString(
string: "Price: $24.99 per month")
// Format "Price:" label with bold font
let priceLabelRange = NSRange(
location: 0, length: 6)
fullText.addAttribute(
NSAttributedString.Key.font,
value: UIFont.boldSystemFont(ofSize: 16),
range: priceLabelRange)
// Format "$24.99" with green color
let amountRange = NSRange(
location: 7, length: 6)
fullText.addAttribute(
NSAttributedString.Key.foregroundColor,
value: UIColor.systemGreen(),
range: amountRange)
fullText.addAttribute(
NSAttributedString.Key.font,
value: UIFont.boldSystemFont(ofSize: 22),
range: amountRange)
// Apply gray color to "per month" text
let periodRange = NSRange(
location: 14, length: 9)
fullText.addAttribute(
NSAttributedString.Key.foregroundColor,
value: UIColor.secondaryLabel,
range: periodRange)
label.attributedText = fullText
UITextView υποστηρίζει διαδραστικούς συνδέσμους στο NSAttributedString. Η ιδιότητα .link με NSURL καθιστά το κείμενο κλικαρισμό. Για τον χειρισμό κλικ χρησιμοποιείται ο εκπρόσωπος UITextViewDelegate με τη μέθοδο textView(_:shouldInteractWith:in:interaction:). Το UITextView υποστηρίζει επίσης επιλογή κειμένου και χρήση UIMenuController για τυπικές λειτουργίες (αντιγραφή, αναζήτηση).
NSAttributedString υποστηρίζει μετατροπή από HTML και RTF μέσω NSAttributedString.DocumentType. Για φόρτωση HTML χρησιμοποιείται ο αρχικοποιητής με παραμέτρους documentAttributes: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil). Παρόμοια για RTF: .rtf ή .rtfd. Αυτός ο μηχανισμός είναι χρήσιμος για εμφάνιση περιεχομένου HTML χωρίς WebView.
Για εξαγωγή σε HTML χρησιμοποιείται η μέθοδος data(from:documentAttributes:) με περιοχή και τύπο εγγράφου. HTML export: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]). Τα ληφθέντα δεδομένα μπορούν να αποθηκευτούν σε αρχείο, να σταλούν στον διακομιστή ή να εμφανιστούν σε WebView. Κατά την εξαγωγή διατηρούνται οι γραμματοσειρές, τα χρώματα, η στοίχιση, οι λίστες — όλες οι ιδιότητες μορφοποίησης μετατρέπονται σε στυλ CSS.
Η υποστήριξη για RTF είναι ιδιαίτερα σχετική για εφαρμογές macOS, όπου το RTF είναι η τυπική μορφή εμπλουτισμένου κειμένου. Το iOS υποστηρίζει επίσης ανάγνωση και εγγραφή RTF, αλλά δεν το χρησιμοποιεί ως κύρια μορφή. Η διαφορά μεταξύ RTF και RTFD: το RTFD περιλαμβάνει ένθετους πόρους (εικόνες) συσκευασμένους σε έναν κατάλογο. NSAttributedString μπορεί να επεξεργαστεί και τις δύο μορφές μέσω μιας ενιαίας διεπαφής.
let htmlString = "<p><b>Bold<\/b> and <i>italic<\/i><\/p>"
guard let htmlData = htmlString.data(
using: String.Encoding.utf8) else { return }
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
NSAttributedString.DocumentReadingOptionKey.documentType:
NSAttributedString.DocumentType.html
]
let attributedFromHTML =
try? NSAttributedString(
data: htmlData,
options: options,
documentAttributes: nil)
Συχνές Ερωτήσεις
NSString αποθηκεύει μόνο μια ακολουθία χαρακτήρων Unicode χωρίς καμία πληροφορία μορφοποίησης. NSAttributedString αποθηκεύει χαρακτήρες και για κάθε υποπεριοχή περιέχει ένα λεξικό ιδιοτήτων (γραμματοσειρά, χρώμα, στυλ). Κατά την εμφάνιση του NSAttributedString, το UIKit χρησιμοποιεί αυτές τις ιδιότητες για απόδοση, δημιουργώντας μορφοποιημένο κείμενο.
Η πιο συνηθισμένη αιτία — η χρήση της ιδιότητας text αντί της attributedText. Κατά την ανάθεση μέσω text, όλες οι ιδιότητες αγνοούνται. Δεύτερη αιτία: μετά τον ορισμό attributedText, αλλάζετε τις font, textColor ή textAlignment του UILabel — αυτές οι αλλαγές επαναφέρουν το attributedText. Χρησιμοποιείτε μόνο attributedText για μορφοποιημένο κείμενο.
Δημιουργήστε NSMutableAttributedString και καλέστε addAttribute(.font, value: boldFont, range: boldRange) για κάθε τμήμα με διαφορετική γραμματοσειρά. Κάθε κλήση εφαρμόζει την ιδιότητα μόνο στην καθορισμένη περιοχή. Οι υπόλοιποι χαρακτήρες διατηρούν την τυπική γραμματοσειρά ή μια άλλη προηγουμένως ορισμένη. Με αυτόν τον τρόπο δημιουργούνται περιοχές ιδιοτήτων (attribute runs) με διαφορετικές γραμματοσειρές.
Ναι, το NSAttributedString επεξεργάζεται σωστά πολύγραμμο κείμενο, συμπεριλαμβανομένων των χαρακτήρων νέας γραμμής ( ). Το UITextView και το UILabel (με numberOfLines = 0) μεταφέρουν αυτόματα το κείμενο σε νέα γραμμή. Το NSMutableParagraphStyle διαχειρίζεται το διάστημα γραμμών, τις εσοχές και τη στοίχιση για κάθε παράγραφο ανεξάρτητα.
Χρησιμοποιήστε NSMutableAttributedString με την ιδιότητα .foregroundColor για κάθε περιοχή χρώματος. Για κόκκινο κείμενο: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). Για μπλε: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). Τα χρώματα θα εφαρμοστούν μόνο στις καθορισμένες περιοχές χαρακτήρων.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης