Attributed Text — NSAttributedString və NSMutableAttributedString sinifləri ilə təmsil olunan iOS SDK mexanizmidir və bir mətn sətrinin müxtəlif hissələrinə çoxsaylı stillər tətbiq etməyə imkan verir. Adi NSString-dən fərqli olaraq, Attributed String yalnız simvolları deyil, həm də hər bir diapazon üçün atributlar lüğətini saxlayır: şrift, rəng, sətirarası boşluq, kölgə və düzləndirmə. Apple Developer Documentation-ya görə, Attributed String UILabel, UITextView və UITextField-də formatlaşdırılmış mətnin göstərilməsi üçün əsasdır. Bu, WebKit və ya üçüncü tərəf kitabxanaları olmadan mətn stilləşdirməsinin standart üsuludur.
Əsas məqamlar
NSAttributedString — simvol diapazonlarına bağlanmış adlandırılmış atributlar dəsti ilə sətri təmsil edən Foundation framework sinfidir. Hər bir atribut açar-dəyər cütüdür: açar sabitlə müəyyən edilir (NSFontAttributeName, NSForegroundColorAttributeName), dəyər isə müvafiq obyektlə (UIFont, UIColor). Atributlar NSRange vasitəsilə simvol diapazonuna tətbiq edilir.
Sinif bütün Apple platformalarında mövcuddur: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString dəyişməzdir — yaradıldıqdan sonra atributları sabit qalır. Dinamik dəyişiklik üçün NSAttributedString-dən miras alan və setAttributes, addAttributes, addAttribute, removeAttribute metodlarını əlavə edən NSMutableAttributedString istifadə olunur.
NSString — stilləşdirmə məlumatı olmayan sadə simvol sətri. UILabel-ə text vasitəsilə ötürülən istənilən mətn bir şrift, rəng və ölçüdə göstərilir. attributedText vasitəsilə ötürülən NSAttributedString hər simvola öz atributlar dəstinə malik olmağa imkan verir. UILabel, UITextView və UITextField avtomatik olaraq NSAttributedString-i tanıyır və mətni atributlara uyğun göstərir.
Daxilən NSAttributedString mətnlə birlikdə NSString və atribut diapazonları massivi saxlayır. Hər bir diapazon NSRange strukturu və atributlar lüğəti ilə təmsil olunur. Göstərmə zamanı sistem diapazonlar üzrə keçir və hər bir hissəyə müvafiq atributları tətbiq edir. Səmərəlilik atribut keçidlərinin sayından asılıdır — qısa hissələrdə tez-tez dəyişmə göstərmə vaxtını artırır.
NSAttributedString atributları — UIKit (iOS) və AppKit-də (macOS) müəyyən edilmiş sabitlərdir, hər biri mətnin vizual formatlaşdırılmasının müəyyən aspektinə uyğundur. Bütün atributlar NSAttributedString.Key sətirləridir, dəyərləri isə müəyyən siniflərin obyektləridir. Atributlar simvol (simvollara təsir edir) və abzas (abzaslara təsir edir) olaraq bölünür.
Simvol atributlarına şrift (NSFontAttributeName), mətn rəngi (NSForegroundColorAttributeName), fon rəngi (NSBackgroundColorAttributeName), altından xətt çəkmə (NSUnderlineStyleAttributeName), üstündən xətt çəkmə (NSStrikethroughStyleAttributeName), kölgə (NSShadowAttributeName) daxildir. Abzas atributları NSParagraphStyleAttributeName vasitəsilə təyin edilir və düzləndirmə, abzaslar, sətirarası boşluq və tabulyasiyanı idarə edir.
NSLinkAttributeName mətndə kliklənə bilən link yaradır: dəyər URL və ya sətirdir. UITextView interaktivlik aktiv olduqda belə linkləri avtomatik idarə edir. NSAttachmentAttributeName mətn daxilində NSTextAttachment — inline element kimi göstərilən təsviri yerləşdirməyə imkan verir. Bu, sətir daxilində nişanlar, emoji və ya xüsusi görünüşlər olan mətnlər yaratmaq üçün istifadə olunur.
Hər bir NSAttributedString atributunun ciddi tipli dəyəri var. iOS inkişafında ən çox istifadə olunan atributlara baxaq. Şrift UIFont obyekti ilə, rəng UIColor ilə, sətirarası boşluq isə düzləndirmə, abzaslar və boşluqları bir obyektdə konfiqurasiya etməyə imkan verən NSMutableParagraphStyle vasitəsilə təyin edilir.
| Atribut açarı | Dəyər tipi | Təyinat |
|---|---|---|
| NSFontAttributeName | UIFont | Mətn şrifti |
| NSForegroundColorAttributeName | UIColor | Mətn rəngi |
| NSBackgroundColorAttributeName | UIColor | Mətn altında fon rəngi |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Altından xətt çəkmə stili |
| NSParagraphStyleAttributeName | NSParagraphStyle | Abzas parametrləri |
| NSKernAttributeName | NSNumber (Float) | Hərflərarası boşluq |
NSParagraphStyle — abzas atributları üçün konteyner: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight və s. Bu parametrləri dəyişmək üçün NSMutableParagraphStyle yaradılır, lazımi xüsusiyyətlər konfiqurasiya edilir və obyekt NSParagraphStyleAttributeName atributunun dəyəri kimi ötürülür. Bu, NSAttributedString-də sətirarası boşluğu idarə etməyin yeganə üsuludur.
NSShadow mətnə kölgə əlavə etməyə imkan verir: shadowOffset, shadowBlurRadius, shadowColor parametrləri kölgənin yerdəyişməsini, bulanıqlığını və rəngini təyin edir. Altından və üstündən xətt çəkmə atributları stillərin kombinasiyalarını qəbul edir: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Xətlərin qalınlığı və rəngini dəqiq idarə etmək üçün NSUnderlineColorAttributeName və NSStrikethroughColorAttributeName istifadə olunur.
Swift-də NSAttributedString yaratmaq mətn və atributlar lüğəti ilə initləşdirici vasitəsilə və ya NSMutableAttributedString ilə addım-addım stillər tətbiq etməklə həyata keçirilir. Əsas yanaşma — bütün mətn üçün atributlar lüğəti təyin etmək, sonra ayrı-ayrı diapazonlar üçün atributlar əlavə etmək və ya dəyişməkdir.
Sadə nümunə — bütün sətir üçün şrift, rəng və düzləndirmə təyin etmək. Atributlar lüğəti NSAttributedString initləşdiricisinə ötürülür. Lüğət açarları NSAttributedString.Key sabitləri, dəyərlər isə müvafiq UIKit obyektləridir. Bu, bütün mətnin vahid formatlaşdırıldığı əsas variantdır.
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
Mətn systemFont 16 şrifti, tünd boz rəng, mərkəzə düzləndirmə və 4pt sətirarası boşluqla göstəriləcək. Bu yanaşma statik başlıqlar və düymələr üçün əlverişlidir.
NSMutableAttributedString mətnin müxtəlif hissələrinə fərqli stillər tətbiq etməyə imkan verir. addAttribute metodu diapazona bir atribut əlavə edir, addAttributes — atributlar lüğəti. setAttributes metodu diapazonun bütün atributlarını yeniləri ilə əvəz edir. Bu, vurğulamalarla mətn yaratmaq üçün əsas vasitədir.
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” sözü yaşıl və qalın olacaq, qalan mətn — standart. NSRange əl ilə hesablanır — simvollarda uzunluğu düzgün saymaq vacibdir, xüsusən emoji və mürəkkəb Unicode simvolları ilə işləyərkən.
NSMutableAttributedString mətn və atributların dinamik dəyişdirilməsi üçün metodlar təqdim edir: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Bu, müxtəlif mənbələrdən mətn qurmağa, stilləri birləşdirməyə və interfeys hadisələrinə reaksiya verməyə imkan verir.
Dəyişməz NSAttributedString-dən fərqli olaraq, mutable versiyası yeni obyekt yaratmadan məzmunun dəyişdirilməsini dəstəkləyir. Bu, mətn redaktorları, çatlar və formalar üçün vacibdir, burada istifadəçi mətni redaktə edə bilər və stillər saxlanmalıdır.
Mesajlaşma proqramlarında hər bir mesaj istifadəçi adı (qalın şrift), mesaj mətni (adi), vaxt (boz rəng) ehtiva edir. NSMutableAttributedString belə bir sətri bir dəfəyə qurmağa, hissələri müvafiq atributlarla lazımi ardıcıllıqda əlavə etməyə imkan verir.
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
Nəticə — üç stilli hissəsi olan bir sətir. Append avtomatik olaraq NSRange-i düzgün hesablayır, mövqeləri əl ilə hesablamaq lazım deyil. Bu yanaşma istənilən sayda fraqment üçün miqyaslanır.
enumerateAttributes(in:options:using:) metodu göstərilən intervalda bütün atribut diapazonları üzrə keçir. Bu, formatlaşdırmanı təhlil etmək üçün faydalıdır: bütün linkləri tapmaq, müəyyən atributların rəngini dəyişmək və ya mətni HTML-ə ixrac etmək. Zamanda atributlar lüğəti və cari hissənin NSRange-i ötürülür.
UIKit-də mətn göstərmək üçün bütün əsas UI komponentləri attributedText xassəsi vasitəsilə NSAttributedString-i dəstəkləyir. UILabel statik stilləşdirilmiş mətn göstərir, UITextView redaktə və linkləri dəstəkləyir, UITextField placeholder və daxil edilmiş mətn üçün ayrıca atributlar qəbul edir.
UILabel — stilləşdirilmiş mətn göstərmək üçün ən yüngül komponentdir. Bütün simvol atributlarını dəstəkləyir, lakin kliklənə bilən linkləri avtomatik idarə etmir (bunun üçün UITextView tələb olunur). UILabel başlıqlar, etiketlər və formatlaşdırma ilə qısa mətnlər üçün idealdır.
UITextView NSLinkAttributeName-i idarə edir və linkləri interaktiv elementlər kimi göstərir. Bu funksionallığı aktiv etmək üçün isSelectable = true və isEditable = false təyin edin. Linkə klik edildikdə, delegate textView(_:shouldInteractWith:in:interaction:) çağırışını alır. UITextView həmçinin mətn daxilində təsvirlər üçün NSTextAttachment-i dəstəkləyir.
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 və isEditable konfiqurasiya edildikdən sonra mətn sahəsi statik mətn bloku kimi davranır, lakin linklər aktiv qalır. UITextViewDelegate delegate klik zamanı davranışı idarə edir.
Core Text — birbaşa NSAttributedString ilə işləyən Apple-ın aşağısəviyyəli mətn renderinq framework-üdür. UIKit-dən fərqli olaraq, Core Text NSAttributedString-i birbaşa göstəriləcək obyekt kimi istifadə etmir, onu CTFramesetter-ə, sonra CTFrame-ə çevirir və Core Graphics kontekstində göstərir. Bu, sətirlərin və gliflərin yerləşdirilməsi üzərində tam nəzarət verir.
Core Text-dən istifadə xüsusi mətn layoutları üçün əsaslandırılır: sütunlar, təsvirlərin ətrafına axın, mətnin fırlanması, qeyri-standart sətir qırılmaları. Core Text-in NSMutableParagraphStyle-ı UIKit-də olmayan atributları ehtiva edir: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode əlavə rejimlərlə.
NSAttributedString UIKit və Core Text arasında problemsiz ötürülür, çünki hər iki framework eyni tiplə işləyir. UIKit atributları (NSFontAttributeName, NSForegroundColorAttributeName) Core Text tərəfindən avtomatik tanınır və əksinə — Core Text atributları (kCTFontAttributeName) UIKit tərəfindən oxunur. Bu, eyni NSAttributedString obyektində sadə tapşırıqlar üçün UIKit-dən və xüsusi renderinq üçün Core Text-dən istifadə etməyə imkan verir.
Tez-tez verilən suallar
NSString stilləşdirmə məlumatı olmadan yalnız mətni saxlayır. NSAttributedString mətni hər bir simvol diapazonu üçün atributlar lüğəti ilə tamamlayır. UILabel-ə text xassəsi vasitəsilə ötürüldükdə NSString düz mətn kimi göstərilir. NSAttributedString attributedText xassəsi vasitəsilə ötürüldükdə bütün atributlar tətbiq edilir: bir sətirdə müxtəlif şriftlər, rənglər və boşluqlar.
addAttributes(_:range:) metodundan atributlar lüğəti ilə istifadə edin: addAttributes([.font: font, .foregroundColor: color], range: range). Bir atribut əlavə etmək və ya dəyişmək üçün addAttribute(_:value:range:) istifadə edin. setAttributes metodu diapazondakı bütün mövcud atributları yeniləri ilə əvəz edir.
NSMutableParagraphStyle yaradın, lineSpacing xassəsini təyin edin, sonra onu NSParagraphStyleAttributeName atributunun dəyəri kimi ötürün. Tam nəzarət üçün minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode və alignment da mövcuddur. ParagraphStyle sətirarası boşluğu idarə etməyin yeganə üsuludur.
Bəli, SwiftUI iOS 15+-də Text(attributedString:) vasitəsilə NSAttributedString-i dəstəkləyir. Köhnə versiyalarda UILabel və ya UITextView ilə UIViewRepresentable istifadə edin. SwiftUI həmçinin Markdown bənzəri sintaksis ilə deklarativ formatlaşdırma üçün öz AttributedString (SwiftUI, Foundation deyil) tipini təqdim edir.
boundingRect(with:options:context:) metodundan istifadə edin, o, verilmiş atributlarla sətri göstərmək üçün tələb olunan CGRect-i qaytarır. options: [.usesLineFragmentOrigin, .usesFontLeading] parametri sətirarası boşluqları və şrift metrikalarını nəzərə alır. Məhdud sayda sətirli UILabel üçün sizeThatFits istifadə edin.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun