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) | Размак између знакова (кернинг) |
| .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 — типно безбедни речник [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 извоз: 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође