NSAttributedString — bu nima, matn formatlash va iOS-da atributlar

Muallif: IT Sectr Nashr etilgan: 2026-07-23 O'qish vaqti: 9 daq

NSAttributedString — iOS SDK tarkibidagi Foundation framework'idan olingan, alohida belgilar yoki matn diapazonlariga qo'llaniladigan formatlash atributlari to'plamiga ega satrni ifodalovchi sinfdir. Oddiy NSString'dan farqli o'laroq, NSAttributedString nafaqat Unicode belgilarini, balki satrning har bir segmenti uchun atributlar lug'atini (shrift, rang, belgilararo interval, tekislash) saqlaydi. Apple Developer Documentation (2026) ma'lumotlariga ko'ra, NSAttributedString iOS'dagi barcha UI-komponentlarda formatlangan matnni ko'rsatish uchun asosdir.

Asosiy fikrlar

  • NSAttributedString — atributlarga ega o'zgarmas satr, bunda har bir belgi yoki diapazonga NSAttributedStringKey atributlar lug'ati mos keladi
  • NSMutableAttributedString — runtime'da atributlarni o'zgartirish uchun addAttribute, setAttributes, replaceCharacters metodlari bilan o'zgaruvchan versiya
  • Asosiy atributlar: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .backgroundColor
  • NSMutableParagraphStyle — tekislash, qatorlararo interval, chekinishlar va matn yo'nalishini o'rnatish uchun yordamchi obyekt
  • UILabel, UITextView, UITextField atributlangan satrlarni ko'rsatish uchun attributedText'ni qo'llab-quvvatlaydi

NSAttributedString nima?

NSAttributedString — formatlangan matn bilan ishlash uchun iOS/macOS'ning asosiy sinfidir. U NSString imkoniyatlarini kengaytirib, satrga atributlar — kalit-qiymat juftliklari lug'atini qo'shadi, bunda kalit NSAttributedStringKey doimiysi (masalan, .font, .foregroundColor), qiymat esa tegishli obyektdir (UIFont, UIColor). Satrdagi har bir belgi o'z atributlar to'plamiga ega bo'lishi mumkin, bu esa bitta satrda aralash formatlashni amalga oshirish imkonini beradi.

NSAttributedString arxitekturasi atribut diapazonlari (attribute runs) kontseptsiyasiga asoslanadi. Agar 0..5 belgi diapazoni uchun .font = UIFont.boldSystemFont(ofSize: 16) atributini o'rnatsangiz, ushbu diapazondagi barcha belgilar qalin shrift bilan ko'rsatiladi. Qolgan belgilar boshqa shriftga ega bo'lishi mumkin yoki umuman atributga ega bo'lmasligi mumkin. Atributlangan satr ko'rsatilganda UIKit tizimi turli diapazonlardan xususiyatlarni birlashtiradi va matnni yagona tarzda render qiladi.

NSAttributedString o'zgarmasdir — yaratilgandan so'ng uning atributlari va mazmuni o'zgartirilishi mumkin emas. O'zgartirish uchun NSMutableAttributedString pastki sinfi mavjud bo'lib, u istalgan diapazonlarda atributlarni qo'shish, o'chirish va o'zgartirish metodlarini taqdim etadi. Bu farq ko'p oqimlilik uchun muhim: o'zgarmas NSAttributedString thread-safe, NSMutableAttributedString esa yo'q.

Matn formatlashning asosiy atributlari

NSAttributedString NSAttributedStringKey'da belgilangan taxminan 40 standart atributni qo'llab-quvvatlaydi. Har bir atribut matn ko'rinishining ma'lum bir jihatiga ta'sir qiladi: shrift, rang, joylashuv, tagiga chizish, soya, belgilararo interval, paragraf uslubi va giperhavolalar. Atribut o'rnatish uchun NSAttributedStringKey doimiysi ishlatiladi va unga tegishli turdagi obyekt tayinlanadi.

Atribut kalitiQiymat turiMaqsadi
.fontUIFontMatn shrifti va o'lchami
.foregroundColorUIColorMatn rangi
.backgroundColorUIColorMatn ostidagi fon rangi
.paragraphStyleNSParagraphStyleTekislash, qatorlararo interval, chekinishlar
.kernNSNumber (Float)Belgilararo interval (kerning)
.underlineStyleNSUnderlineStyle (Int)Tagiga chizish uslubi (single, double, thick, pattern)
.strikethroughStyleNSUnderlineStyle (Int)Ustidan chizish uslubi
.linkNSURLInteraktiv giperhavola uchun URL
.shadowNSShadowOffset, blurRadius va rang bilan matn soyasi
.baselineOffsetNSNumber (Float)Matnning tayanch chizig'iga nisbatan siljishi

NSParagraphStyle — paragrafni formatlash

NSMutableParagraphStyle — paragrafning vizual xususiyatlarini boshqaruvchi obyekt: tekislash (.alignment: .left, .center, .right, .justified), qatorlararo interval (.lineSpacing), paragraflar orasidagi masofa (.paragraphSpacing), birinchi qator chekinishi (.firstLineHeadIndent), chap va o'ng chekinishlar (.headIndent, .tailIndent) va matn yo'nalishi (.baseWritingDirection). ParagraphStyle, butun paragraf uchun bir xil formatlash talab qilinsa, yangi qator belgilarini o'z ichiga olgan diapazonga qo'llaniladi.

Kodda NSAttributedString qanday yaratiladi

Yaratish NSAttributedString, satr va atributlar lug'atini qabul qiluvchi initsializator orqali amalga oshiriladi. Atributlar butun satrga qo'llaniladi. Aralash formatlash (satrning turli qismlarida turli atributlar) uchun NSMutableAttributedString ishlatiladi, so'ngra aniq diapazonlarga atributlar qo'shiladi. Objective-C NSAttributedStringKey: UIFont lug'atidan, Swift esa tip-xavfsiz [NSAttributedString.Key: Any] lug'atidan foydalanadi.

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 bilan yaratish

Misol paragrafni formatlashni NSMutableParagraphStyle orqali ko'rsatadi. Markazga tekislash, 8 punkt qatorlararo interval, paragrafdan keyin 12 punkt bo'shliq o'rnatiladi. ParagraphStyle .paragraphStyle kaliti ostida atributlar lug'atiga qo'shiladi. NSAttributedString uzatilgan paragraphStyle nusxasini oladi, shuning uchun satr yaratilgandan so'ng uni o'zgartirish allaqachon yaratilgan satrga ta'sir qilmaydi.

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 va atributlarni o'zgartirish

NSMutableAttributedString — yaratilgandan so'ng mazmun va atributlarni o'zgartirish imkonini beruvchi NSAttributedString pastki sinfidir. Asosiy metodlar: diapazonga bitta atribut qo'shish uchun addAttribute(_:value:range:); bir nechta atribut qo'shish uchun addAttributes(_:range:); diapazondagi barcha atributlarni almashtirish uchun setAttributes(_:range:); atributni o'chirish uchun removeAttribute(_:range:); matnni almashtirish uchun replaceCharacters(in:with:).

addAttribute va addAttributes mavjud atributlarga qo'shimcha qiladi, allaqachon o'rnatilganlarni o'chirmaydi. Diapazonda bir xil kalitli atribut allaqachon mavjud bo'lsa, uning qiymati almashtiriladi. setAttributes diapazon uchun atributlar lug'atini to'liq almashtiradi — ilgari o'rnatilgan barcha atributlar o'chiriladi. Bu bitta satrni ketma-ket formatlashda muhim: addAttributes xavfsizroq, chunki u allaqachon o'rnatilgan shriftlar va ranglarni qayta tiklamaydi.

Diapazonlar (NSRange) NSRange(location: 0, length: 5) strukturasi bilan belgilanadi. location — boshlang'ich indeks (0-asosli), length — belgilar soni. Diapazon satr chegarasidan chiqib ketsa, NSMutableAttributedString NSRangeException istisnosini yaratadi. Diapazonlar bilan xavfsiz ishlash uchun Foundation'dan NSIntersectionRange va NSUnionRange kabi NSRange metodlari ishlatiladi.

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'da atributlangan satrni ko'rsatish namunasi

Eng keng tarqalgan usul NSAttributedString'ni ko'rsatish — uni UILabel'ning attributedText xususiyatiga tayinlashdir. text xususiyatidan farqli o'laroq, attributedText render qilish uchun atributlardan foydalanadi, aralash formatlashni qo'llab-quvvatlaydi. Muhim: attributedText o'rnatilgan bo'lsa, UILabel font, textColor, textAlignment xususiyatlarini e'tiborsiz qoldiradi — barcha vizual xususiyatlar NSAttributedString atributlaridan olinadi.

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

Interaktiv havolalar bilan UITextView'da ko'rsatish

UITextView NSAttributedString'dagi interaktiv havolalarni qo'llab-quvvatlaydi. NSURL bilan .link atributi matnni bosiladigan qiladi. Bosishlarni boshqarish uchun textView(_:shouldInteractWith:in:interaction:) metodi bilan UITextViewDelegate ishlatiladi. UITextView shuningdek matn tanlash va standart operatsiyalar (nusxalash, qidirish) uchun UIMenuController'dan foydalanishni qo'llab-quvvatlaydi.

NSAttributedString'ni HTML va RTF'ga konvertatsiya qilish

NSAttributedString NSAttributedString.DocumentType orqali HTML va RTF'dan konvertatsiyani qo'llab-quvvatlaydi. HTML yuklash uchun documentAttributes parametrlari bilan initsializator ishlatiladi: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil). RTF uchun ham xuddi shunday: .rtf yoki .rtfd. Bu mexanizm WebView'siz HTML mazmunini ko'rsatish uchun foydalidir.

HTML'ga eksport uchun diapazon va hujjat turi bilan data(from:documentAttributes:) metodi ishlatiladi. HTML export: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]). Olingan ma'lumotlarni faylga saqlash, serverga yuborish yoki WebView'da ko'rsatish mumkin. Eksport paytida shriftlar, ranglar, tekislash, ro'yxatlar saqlanadi — barcha formatlash atributlari CSS uslublariga konvertatsiya qilinadi.

RTF qo'llab-quvvatlashi, ayniqsa, RTF boy matnning standart formati bo'lgan macOS ilovalari uchun dolzarbdir. iOS ham RTF o'qish va yozishni qo'llab-quvvatlaydi, lekin uni asosiy format sifatida ishlatmaydi. RTF va RTFD o'rtasidagi farq: RTFD katalogga qadoqlangan ichki resurslarni (tasvirlar) o'z ichiga oladi. NSAttributedString yagona interfeys orqali ikkala formatni ham qayta ishlay oladi.

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)

Ko'p beriladigan savollar

NSString va NSAttributedString o'rtasidagi farq nima?

NSString faqat Unicode belgilar ketma-ketligini hech qanday formatlash ma'lumotisiz saqlaydi. NSAttributedString belgilarni saqlaydi va har bir pastki diapazon uchun atributlar lug'atini (shrift, rang, uslub) o'z ichiga oladi. NSAttributedString ko'rsatilganda UIKit formatlangan matn yaratish uchun ushbu atributlardan foydalanadi.

Nega UILabel NSAttributedString atributlarini ko'rsatmaydi?

Eng keng tarqalgan sabab — attributedText o'rniga text xususiyatidan foydalanishdir. Text orqali tayinlashda barcha atributlar e'tiborga olinmaydi. Ikkinchi sabab: attributedText o'rnatgandan so'ng UILabel'ning font, textColor yoki textAlignment xususiyatlarini o'zgartirasiz — bu o'zgarishlar attributedText'ni qayta tiklaydi. Formatlangan matn uchun faqat attributedText'dan foydalaning.

Bir satrda turli shriftlarni qanday qo'llash mumkin?

NSMutableAttributedString yarating va turli shriftli har bir qism uchun addAttribute(.font, value: boldFont, range: boldRange) ni chaqiring. Har bir chaqiruv atributni faqat ko'rsatilgan diapazonga qo'llaydi. Qolgan belgilar standart shriftni yoki oldindan o'rnatilgan boshqa shriftni saqlaydi. Shu tarzda turli shriftlar bilan atribut diapazonlari (attribute runs) yaratiladi.

NSAttributedString ko'p qatorli matn bilan ishlaydimi?

Ha, NSAttributedString ko'p qatorli matnni, jumladan yangi qator belgilarini ( ) to'g'ri qayta ishlaydi. UITextView va UILabel (numberOfLines = 0 bilan) avtomatik ravishda matnni yangi qatorga o'tkazadi. NSMutableParagraphStyle har bir paragraf uchun mustaqil ravishda qatorlararo interval, chekinishlar va tekislashni boshqaradi.

Bir satrda turli ranglar bilan rangli matn qanday yaratiladi?

Har bir rang diapazoni uchun .foregroundColor atributi bilan NSMutableAttributedString dan foydalaning. Qizil matn uchun: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). Ko'k uchun: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). Ranglar faqat ko'rsatilgan belgi diapazonlariga qo'llaniladi.

Xulosa

  • NSAttributedString — har bir belgi diapazoni uchun lug'atda saqlanadigan formatlash atributlari (shrift, rang, uslub) bilan satr
  • NSMutableAttributedString — dinamik formatlash uchun addAttribute, setAttributes va removeAttribute metodlari bilan o'zgaruvchan versiya
  • Asosiy atributlar: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .shadow, .baselineOffset
  • NSMutableParagraphStyle paragraflar uchun tekislash, qatorlararo interval, chekinishlar va matn yo'nalishini boshqaradi
  • UILabel, UITextView, UITextField attributedText xususiyati orqali formatlangan matnni ko'rsatishni qo'llab-quvvatlaydi
  • HTML/RTF konvertatsiyasi — NSAttributedString documentType orqali formatlangan matnning import va eksportini qo'llab-quvvatlaydi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing