Attributed Text — bu iOS SDK mexanizmi bo'lib, NSAttributedString va NSMutableAttributedString sinflari orqali taqdim etiladi va bitta matn qatorining turli qismlariga bir nechta stillarni qo'llash imkonini beradi. Oddiy NSString-dan farqli o'laroq, Attributed String nafaqat belgilarni, balki har bir diapazon uchun atributlar lug'atini ham saqlaydi: shrift, rang, qatorlararo bo'shliq, soya va tekislash. Apple Developer Documentation ga ko'ra, Attributed String UILabel, UITextView va UITextField da formatlangan matnni ko'rsatish uchun asos hisoblanadi. Bu WebKit yoki uchinchi tomon kutubxonalarisiz matnni stillashtirishning standart usulidir.
Asosiy ma'lumotlar
NSAttributedString — bu Foundation framework sinfi bo'lib, belgilar diapazonlariga bog'langan nomlangan atributlar to'plami bilan qatorni ifodalaydi. Har bir atribut kalit-qiymat juftligidir: kalit doimiy bilan belgilanadi (NSFontAttributeName, NSForegroundColorAttributeName), qiymat esa tegishli obyekt bilan (UIFont, UIColor). Atributlar NSRange orqali belgilar diapazoniga qo'llaniladi.
Sinf barcha Apple platformalarida mavjud: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString o'zgarmasdir — yaratilgandan so'ng, uning atributlari qat'iy. Dinamik o'zgartirish uchun NSAttributedString dan meros oladigan va setAttributes, addAttributes, addAttribute, removeAttribute metodlarini qo'shadigan NSMutableAttributedString ishlatiladi.
NSString — stillashtirish ma'lumotisiz oddiy belgilar qatori. UILabel ga text orqali uzatilgan har qanday matn bitta shrift, rang va o'lchamda ko'rsatiladi. attributedText orqali uzatilgan NSAttributedString har bir belgiga o'z atributlar to'plamiga ega bo'lish imkonini beradi. UILabel, UITextView va UITextField avtomatik ravishda NSAttributedString ni taniydi va matnni atributlarga muvofiq ko'rsatadi.
Ichki jihatdan NSAttributedString matn bilan NSString va atribut diapazonlari massivini saqlaydi. Har bir diapazon NSRange strukturasi va atributlar lug'ati bilan ifodalanadi. Ko'rsatishda tizim diapazonlar bo'ylab o'tadi va har bir qismga tegishli atributlarni qo'llaydi. Samaradorlik atribut almashishlar soniga bog'liq — qisqa qismlarda tez-tez o'zgarish ko'rsatish vaqtini oshiradi.
NSAttributedString atributlari — UIKit (iOS) va AppKit (macOS) da belgilangan doimiylar bo'lib, ularning har biri matnning vizual formatlashining ma'lum bir jihatiga mos keladi. Barcha atributlar NSAttributedString.Key satrlari bo'lib, ularning qiymatlari ma'lum sinflarning obyektlaridir. Atributlar belgi (belgilarga ta'sir qiladi) va paragraf (paragraflarga ta'sir qiladi) ga bo'linadi.
Belgi atributlariga shrift (NSFontAttributeName), matn rangi (NSForegroundColorAttributeName), fon rangi (NSBackgroundColorAttributeName), tagiga chizish (NSUnderlineStyleAttributeName), ustidan chizish (NSStrikethroughStyleAttributeName), soya (NSShadowAttributeName) kiradi. Paragraf atributlari NSParagraphStyleAttributeName orqali o'rnatiladi va tekislash, chekinishlar, qatorlararo bo'shliq va tabulyatsiyani boshqaradi.
NSLinkAttributeName matnda bosiladigan link yaratadi: qiymat URL yoki satr. UITextView interaktivlik yoqilgan bo'lsa, bunday linklarni avtomatik qayta ishlaydi. NSAttachmentAttributeName matn ichida NSTextAttachment — inline element sifatida ko'rsatiladigan tasvirni joylashtirish imkonini beradi. Bu qator ichida belgilar, emoji yoki maxsus ko'rinishlar bilan matn yaratish uchun ishlatiladi.
Har bir NSAttributedString atributi qat'iy tiplangan qiymatga ega. iOS rivojlanishida eng ko'p ishlatiladigan atributlarni ko'rib chiqaylik. Shrift UIFont obyekti bilan, rang UIColor bilan, qatorlararo bo'shliq esa tekislash, chekinishlar va bo'shliqlarni bitta obyektda sozlash imkonini beradigan NSMutableParagraphStyle orqali o'rnatiladi.
| Atribut kaliti | Qiymat turi | Maqsad |
|---|---|---|
| NSFontAttributeName | UIFont | Matn shrifti |
| NSForegroundColorAttributeName | UIColor | Matn rangi |
| NSBackgroundColorAttributeName | UIColor | Matn ostidagi fon rangi |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Tagiga chizish stili |
| NSParagraphStyleAttributeName | NSParagraphStyle | Paragraf sozlamalari |
| NSKernAttributeName | NSNumber (Float) | Harflararo bo'shliq |
NSParagraphStyle — paragraf atributlari uchun konteyner: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight va boshqalar. Bu parametrlarni o'zgartirish uchun NSMutableParagraphStyle yaratiladi, kerakli xususiyatlar sozlanadi va obyekt NSParagraphStyleAttributeName atributining qiymati sifatida uzatiladi. Bu NSAttributedString da qatorlararo bo'shliqni boshqarishning yagona usulidir.
NSShadow matnga soya qo'shish imkonini beradi: shadowOffset, shadowBlurRadius, shadowColor parametrlari soyaning siljishi, xiraligi va rangini belgilaydi. Tagiga va ustidan chizish atributlari stillarning kombinatsiyalarini qabul qiladi: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Chiziqlarning qalinligi va rangini aniq boshqarish uchun NSUnderlineColorAttributeName va NSStrikethroughColorAttributeName ishlatiladi.
Swift da NSAttributedString yaratish matn va atributlar lug'ati bilan initilizator orqali yoki NSMutableAttributedString bilan bosqichma-bosqich stillarni qo'llash orqali amalga oshiriladi. Asosiy yondashuv — butun matn uchun atributlar lug'atini belgilash, keyin alohida diapazonlar uchun atributlar qo'shish yoki o'zgartirish.
Oddiy misol — butun qator uchun shrift, rang va tekislashni o'rnatish. Atributlar lug'ati NSAttributedString initilizatoriga uzatiladi. Lug'at kalitlari NSAttributedString.Key doimiylari, qiymatlar tegishli UIKit obyektlaridir. Bu butun matn bir xil formatlanganda asosiy variantdir.
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
Matn systemFont 16 shrifti, to'q kulrang rang, markazga tekislash va 4pt qatorlararo bo'shliq bilan ko'rsatiladi. Bu yondashuv statik sarlavhalar va tugmalar uchun qulay.
NSMutableAttributedString matnning turli qismlariga turli stillarni qo'llash imkonini beradi. addAttribute metodi diapazonga bitta atribut qo'shadi, addAttributes — atributlar lug'ati. setAttributes metodi diapazonning barcha atributlarini yangilari bilan almashtiradi. Bu urg'u bilan matn yaratish uchun asosiy vositadir.
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” so'zi yashil va qalin bo'ladi, qolgan matn — standart. NSRange qo'lda hisoblanadi — belgilarda uzunlikni to'g'ri sanash muhim, ayniqsa emoji va murakkab Unicode belgilari bilan ishlashda.
NSMutableAttributedString matn va atributlarni dinamik o'zgartirish uchun metodlarni taqdim etadi: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Bu turli manbalardan matn qurish, stillarni birlashtirish va interfeys hodisalariga reaksiya berish imkonini beradi.
O'zgarmas NSAttributedString dan farqli o'laroq, mutable versiyasi yangi obyekt yaratmasdan mazmunni o'zgartirishni qo'llab-quvvatlaydi. Bu matn muharrirlari, chatlar va formalar uchun muhim, bu erda foydalanuvchi matnni tahrirlashi mumkin va stillar saqlanishi kerak.
Messenger ilovalarida har bir xabar foydalanuvchi nomi (qalin shrift), xabar matni (oddiy), vaqt (kulrang rang) ni o'z ichiga oladi. NSMutableAttributedString bunday qatorni bir martada qurish, qismlarni tegishli atributlar bilan kerakli tartibda qo'shish imkonini beradi.
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
Natija — uch stilli qismga ega bitta qator. Append avtomatik ravishda NSRange ni to'g'ri hisoblaydi, pozitsiyalarni qo'lda hisoblash shart emas. Bu yondashuv istalgan miqdordagi fragmentlar uchun masshtablanadi.
enumerateAttributes(in:options:using:) metodi belgilangan intervaldagi barcha atribut diapazonlari bo'ylab o'tadi. Bu formatlashni tahlil qilish uchun foydali: barcha linklarni topish, ma'lum atributlarning rangini o'zgartirish yoki matnni HTML ga eksport qilish. Yopilishda atributlar lug'ati va joriy qismning NSRange i uzatiladi.
UIKit da matn ko'rsatish uchun barcha asosiy UI komponentlari attributedText xususiyati orqali NSAttributedString ni qo'llab-quvvatlaydi. UILabel statik stillashtirilgan matnni ko'rsatadi, UITextView tahrirlash va linklarni qo'llab-quvvatlaydi, UITextField placeholder va kiritilgan matn uchun alohida atributlarni qabul qiladi.
UILabel — stillashtirilgan matnni ko'rsatish uchun eng engil komponent. Barcha belgi atributlarini qo'llab-quvvatlaydi, lekin bosiladigan linklarni avtomatik qayta ishlamaydi (buning uchun UITextView kerak). UILabel sarlavhalar, yorliqlar va formatlash bilan qisqa matnlar uchun idealdir.
UITextView NSLinkAttributeName ni qayta ishlaydi va linklarni interaktiv elementlar sifatida ko'rsatadi. Bu funksiyani yoqish uchun isSelectable = true va isEditable = false ni o'rnating. Link bosilganda, delegate textView(_:shouldInteractWith:in:interaction:) chaqiruvini oladi. UITextView shuningdek matn ichidagi tasvirlar uchun NSTextAttachment ni qo'llab-quvvatlaydi.
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 va isEditable sozlangandan so'ng, matn maydoni statik matn bloki kabi harakat qiladi, lekin linklar faol qoladi. UITextViewDelegate delegate bosishdagi xatti-harakatni boshqaradi.
Core Text — bu Apple-ning to'g'ridan-to'g'ri NSAttributedString bilan ishlaydigan past darajali matn renderlash frameworkidir. UIKit dan farqli o'laroq, Core Text NSAttributedString ni to'g'ridan-to'g'ri ko'rsatiladigan obyekt sifatida ishlatmaydi, balki uni CTFramesetter ga, keyin CTFrame ga aylantiradi va Core Graphics kontekstida ko'rsatadi. Bu qatorlar va gliflarning joylashuvi ustidan to'liq nazorat beradi.
Core Text dan foydalanish maxsus matn layoutlari uchun asoslanadi: ustunlar, tasvirlar atrofida oqish, matnni aylantirish, nostandart qator uzilishlari. Core Text ning NSMutableParagraphStyle i UIKit da mavjud bo'lmagan atributlarni o'z ichiga oladi: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode qo'shimcha rejimlar bilan.
NSAttributedString UIKit va Core Text o'rtasida muammosiz uzatiladi, chunki ikkala framework bir xil tur bilan ishlaydi. UIKit atributlari (NSFontAttributeName, NSForegroundColorAttributeName) Core Text tomonidan avtomatik tan olinadi va aksincha — Core Text atributlari (kCTFontAttributeName) UIKit tomonidan o'qiladi. Bu bir xil NSAttributedString obyektida oddiy vazifalar uchun UIKit dan va maxsus renderlash uchun Core Text dan foydalanish imkonini beradi.
Tez-tez beriladigan savollar
NSString stillashtirish ma'lumotisiz faqat matnni saqlaydi. NSAttributedString matnni har bir belgi diapazoni uchun atributlar lug'ati bilan to'ldiradi. UILabel ga text xususiyati orqali uzatilganda NSString oddiy matn sifatida ko'rsatiladi. NSAttributedString attributedText xususiyati orqali uzatilganda barcha atributlar qo'llaniladi: bitta qatorda turli shriftlar, ranglar va bo'shliqlar.
addAttributes(_:range:) metodidan atributlar lug'ati bilan foydalaning: addAttributes([.font: font, .foregroundColor: color], range: range). Bitta atribut qo'shish yoki o'zgartirish uchun addAttribute(_:value:range:) dan foydalaning. setAttributes metodi diapazondagi barcha mavjud atributlarni yangilari bilan almashtiradi.
NSMutableParagraphStyle yarating, lineSpacing xususiyatini o'rnating, so'ng uni NSParagraphStyleAttributeName atributining qiymati sifatida uzating. To'liq nazorat uchun minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode va alignment ham mavjud. ParagraphStyle qatorlararo bo'shliqni boshqarishning yagona usulidir.
Ha, SwiftUI iOS 15+ da Text(attributedString:) orqali NSAttributedString ni qo'llab-quvvatlaydi. Eski versiyalarda UILabel yoki UITextView bilan UIViewRepresentable dan foydalaning. SwiftUI shuningdek Markdown o'xshash sintaksis bilan deklarativ formatlash uchun o'zining AttributedString (SwiftUI, Foundation emas) turini taqdim etadi.
boundingRect(with:options:context:) metodidan foydalaning, u berilgan atributlar bilan qatorni ko'rsatish uchun zarur bo'lgan CGRect ni qaytaradi. options: [.usesLineFragmentOrigin, .usesFontLeading] parametri qatorlararo bo'shliqlar va shrift metrikalarini hisobga oladi. Cheklangan qatorlar soniga ega UILabel uchun sizeThatFits dan foydalaning.
Xulosa
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.