NSAttributedString — τι είναι, μορφοποίηση κειμένου και ιδιότητες στο iOS

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

NSAttributedString — είναι μια κλάση από το Foundation framework στο iOS SDK που αναπαριστά μια συμβολοσειρά με ένα σύνολο ιδιοτήτων μορφοποίησης που εφαρμόζονται σε μεμονωμένους χαρακτήρες ή περιοχές κειμένου. Σε αντίθεση με το συνηθισμένο NSString, το NSAttributedString αποθηκεύει όχι μόνο χαρακτήρες Unicode, αλλά και ένα λεξικό ιδιοτήτων (γραμματοσειρά, χρώμα, διάστημα μεταξύ χαρακτήρων, στοίχιση) για κάθε τμήμα της συμβολοσειράς. Σύμφωνα με την Apple Developer Documentation (2026), το NSAttributedString αποτελεί τη βάση για την εμφάνιση μορφοποιημένου κειμένου σε όλα τα UI στοιχεία του iOS.

Κύρια σημεία

  • NSAttributedString — αμετάβλητη συμβολοσειρά με ιδιότητες, όπου κάθε χαρακτήρας ή περιοχή αντιστοιχεί σε ένα λεξικό ιδιοτήτων NSAttributedStringKey
  • NSMutableAttributedString — μεταβλητή έκδοση με μεθόδους addAttribute, setAttributes, replaceCharacters για τροποποίηση ιδιοτήτων κατά το runtime
  • Βασικές ιδιότητες: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .backgroundColor
  • NSMutableParagraphStyle — βοηθητικό αντικείμενο για ορισμό στοίχισης, διαστήματος γραμμών, εσοχών και κατεύθυνσης κειμένου
  • UILabel, UITextView, UITextField υποστηρίζουν attributedText για εμφάνιση συμβολοσειρών με ιδιότητες

Τι είναι το NSAttributedString;

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 και της εκχωρείται ένα αντικείμενο του αντίστοιχου τύπου.

Κλειδί ιδιότηταςΤύπος τιμήςΣκοπός
.fontUIFontΓραμματοσειρά και μέγεθος κειμένου
.foregroundColorUIColorΧρώμα κειμένου
.backgroundColorUIColorΧρώμα φόντου κάτω από το κείμενο
.paragraphStyleNSParagraphStyleΣτοίχιση, διάστημα γραμμών, εσοχές
.kernNSNumber (Float)Διάστημα μεταξύ χαρακτήρων (kerning)
.underlineStyleNSUnderlineStyle (Int)Στυλ υπογράμμισης (single, double, thick, pattern)
.strikethroughStyleNSUnderlineStyle (Int)Στυλ διαγραφής
.linkNSURLURL για διαδραστικό υπερσύνδεσμο
.shadowNSShadowΣκιά κειμένου με offset, blurRadius και χρώμα
.baselineOffsetNSNumber (Float)Μετατόπιση κειμένου σε σχέση με τη γραμμή βάσης

NSParagraphStyle — μορφοποίηση παραγράφου

NSMutableParagraphStyle — αντικείμενο που διαχειρίζεται τα οπτικά χαρακτηριστικά της παραγράφου: στοίχιση (.alignment: .left, .center, .right, .justified), διάστημα γραμμών (.lineSpacing), απόσταση μεταξύ παραγράφων (.paragraphSpacing), εσοχή πρώτης γραμμής (.firstLineHeadIndent), αριστερή και δεξιά εσοχή (.headIndent, .tailIndent) και κατεύθυνση κειμένου (.baseWritingDirection). Το ParagraphStyle εφαρμόζεται στην περιοχή που περιλαμβάνει χαρακτήρες νέας γραμμής, εάν απαιτείται η ίδια μορφοποίηση για ολόκληρη την παράγραφο.

Πώς να δημιουργήσετε NSAttributedString σε κώδικα

Δημιουργία Το NSAttributedString γίνεται μέσω αρχικοποιητή που δέχεται μια συμβολοσειρά και ένα λεξικό ιδιοτήτων. Οι ιδιότητες εφαρμόζονται σε ολόκληρη τη συμβολοσειρά. Για μικτή μορφοποίηση (διαφορετικές ιδιότητες σε διαφορετικά μέρη της συμβολοσειράς) χρησιμοποιείται NSMutableAttributedString με επακόλουθη προσθήκη ιδιοτήτων σε συγκεκριμένες περιοχές. Objective-C χρησιμοποιεί το λεξικό NSAttributedStringKey: UIFont, ενώ το Swift χρησιμοποιεί το type-safe λεξικό [NSAttributedString.Key: Any].

swift
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

Το παράδειγμα δείχνει μορφοποίηση παραγράφου μέσω NSMutableParagraphStyle. Ορίζεται κεντρική στοίχιση, διάστημα γραμμών 8 στιγμών, απόσταση μετά την παράγραφο 12 στιγμών. Το ParagraphStyle προστίθεται στο λεξικό ιδιοτήτων υπό το κλειδί .paragraphStyle. NSAttributedString αντιγράφει το μεταδιδόμενο paragraphStyle, επομένως μετά τη δημιουργία της συμβολοσειράς μπορεί να τροποποιηθεί χωρίς να επηρεάσει την ήδη δημιουργημένη συμβολοσειρά.

swift
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 και τροποποίηση ιδιοτήτων

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.

swift
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)

Παράδειγμα εμφάνισης συμβολοσειράς με ιδιότητες σε UILabel

Ο πιο συνηθισμένος τρόπος εμφάνισης NSAttributedString — ανάθεσή του στην ιδιότητα attributedText του UILabel. Σε αντίθεση με την ιδιότητα text, το attributedText χρησιμοποιεί ιδιότητες για απόδοση, υποστηρίζοντας μικτή μορφοποίηση. Σημαντικό: εάν έχει οριστεί attributedText, το UILabel αγνοεί τις ιδιότητες font, textColor, textAlignment — όλα τα οπτικά χαρακτηριστικά προέρχονται από τις ιδιότητες του NSAttributedString.

swift
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 με διαδραστικούς συνδέσμους

UITextView υποστηρίζει διαδραστικούς συνδέσμους στο NSAttributedString. Η ιδιότητα .link με NSURL καθιστά το κείμενο κλικαρισμό. Για τον χειρισμό κλικ χρησιμοποιείται ο εκπρόσωπος UITextViewDelegate με τη μέθοδο textView(_:shouldInteractWith:in:interaction:). Το UITextView υποστηρίζει επίσης επιλογή κειμένου και χρήση UIMenuController για τυπικές λειτουργίες (αντιγραφή, αναζήτηση).

Μετατροπή NSAttributedString σε HTML και RTF

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 μπορεί να επεξεργαστεί και τις δύο μορφές μέσω μιας ενιαίας διεπαφής.

swift
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 και NSAttributedString;

NSString αποθηκεύει μόνο μια ακολουθία χαρακτήρων Unicode χωρίς καμία πληροφορία μορφοποίησης. NSAttributedString αποθηκεύει χαρακτήρες και για κάθε υποπεριοχή περιέχει ένα λεξικό ιδιοτήτων (γραμματοσειρά, χρώμα, στυλ). Κατά την εμφάνιση του NSAttributedString, το UIKit χρησιμοποιεί αυτές τις ιδιότητες για απόδοση, δημιουργώντας μορφοποιημένο κείμενο.

Γιατί το UILabel δεν εμφανίζει τις ιδιότητες του NSAttributedString;

Η πιο συνηθισμένη αιτία — η χρήση της ιδιότητας text αντί της attributedText. Κατά την ανάθεση μέσω text, όλες οι ιδιότητες αγνοούνται. Δεύτερη αιτία: μετά τον ορισμό attributedText, αλλάζετε τις font, textColor ή textAlignment του UILabel — αυτές οι αλλαγές επαναφέρουν το attributedText. Χρησιμοποιείτε μόνο attributedText για μορφοποιημένο κείμενο.

Πώς να εφαρμόσω διαφορετικές γραμματοσειρές σε μία συμβολοσειρά;

Δημιουργήστε NSMutableAttributedString και καλέστε addAttribute(.font, value: boldFont, range: boldRange) για κάθε τμήμα με διαφορετική γραμματοσειρά. Κάθε κλήση εφαρμόζει την ιδιότητα μόνο στην καθορισμένη περιοχή. Οι υπόλοιποι χαρακτήρες διατηρούν την τυπική γραμματοσειρά ή μια άλλη προηγουμένως ορισμένη. Με αυτόν τον τρόπο δημιουργούνται περιοχές ιδιοτήτων (attribute runs) με διαφορετικές γραμματοσειρές.

Λειτουργεί το NSAttributedString με πολύγραμμο κείμενο;

Ναι, το NSAttributedString επεξεργάζεται σωστά πολύγραμμο κείμενο, συμπεριλαμβανομένων των χαρακτήρων νέας γραμμής ( ). Το UITextView και το UILabel (με numberOfLines = 0) μεταφέρουν αυτόματα το κείμενο σε νέα γραμμή. Το NSMutableParagraphStyle διαχειρίζεται το διάστημα γραμμών, τις εσοχές και τη στοίχιση για κάθε παράγραφο ανεξάρτητα.

Πώς να δημιουργήσω έγχρωμο κείμενο με διαφορετικά χρώματα σε μία συμβολοσειρά;

Χρησιμοποιήστε NSMutableAttributedString με την ιδιότητα .foregroundColor για κάθε περιοχή χρώματος. Για κόκκινο κείμενο: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). Για μπλε: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). Τα χρώματα θα εφαρμοστούν μόνο στις καθορισμένες περιοχές χαρακτήρων.

Σύνοψη

  • NSAttributedString — συμβολοσειρά με ιδιότητες μορφοποίησης (γραμματοσειρά, χρώμα, στυλ) αποθηκευμένες σε λεξικό για κάθε περιοχή χαρακτήρων
  • NSMutableAttributedString — μεταβλητή έκδοση με μεθόδους addAttribute, setAttributes και removeAttribute για δυναμική μορφοποίηση
  • Βασικές ιδιότητες: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .shadow, .baselineOffset
  • NSMutableParagraphStyle διαχειρίζεται στοίχιση, διάστημα γραμμών, εσοχές και κατεύθυνση κειμένου για παραγράφους
  • UILabel, UITextView, UITextField υποστηρίζουν εμφάνιση μορφοποιημένου κειμένου μέσω της ιδιότητας attributedText
  • Μετατροπή HTML/RTF — NSAttributedString υποστηρίζει εισαγωγή και εξαγωγή μορφοποιημένου κειμένου μέσω documentType

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

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

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

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