Attributed Text, NSAttributedString ve NSMutableAttributedString sınıfları tarafından temsil edilen bir iOS SDK mekanizmasıdır ve tek bir metin dizesinin farklı bölümlerine birden çok stil uygulanmasına olanak tanır. Sıradan bir NSString’ın aksine, Attributed String yalnızca karakterleri değil, her aralık için bir nitelik sözlüğünü de depolar: yazı tipi, renk, satır aralığı, gölge ve hizalama. Apple Developer Documentation’ya göre Attributed String, UILabel, UITextView ve UITextField’de biçimlendirilmiş metin görüntülemenin temelidir. WebKit veya üçüncü taraf kitaplıklar olmadan metin stilize etmenin standart yoludur.
Önemli Noktalar
NSAttributedString, karakter aralıklarına bağlı adlandırılmış nitelikler kümesine sahip bir diziyi temsil eden Foundation çerçevesi sınıfıdır. Her nitelik bir anahtar-değer çiftidir: anahtar bir sabit (NSFontAttributeName, NSForegroundColorAttributeName) tarafından tanımlanır ve değer karşılık gelen nesnedir (UIFont, UIColor). Nitelikler NSRange aracılığıyla bir karakter aralığına uygulanır.
Sınıf tüm Apple platformlarında mevcuttur: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString değiştirilemez — bir kez oluşturulduğunda nitelikleri sabittir. Dinamik değişiklikler için, NSAttributedString’den miras alan ve setAttributes, addAttributes, addAttribute, removeAttribute yöntemlerini ekleyen NSMutableAttributedString kullanılır.
NSString, stil bilgisi olmayan basit bir karakter dizisidir. text aracılığıyla UILabel’e gönderilen herhangi bir metin, tek bir yazı tipi, renk ve boyutta görüntülenir. attributedText aracılığıyla gönderilen NSAttributedString, her karakterin kendi nitelik kümesine sahip olmasını sağlar. UILabel, UITextView ve UITextField, NSAttributedString’i otomatik olarak tanır ve metni niteliklerine göre işler.
Dahili olarak, NSAttributedString metinle birlikte bir NSString ve bir nitelik aralıkları dizisi depolar. Her aralık bir NSRange yapısı ve bir nitelik sözlüğü ile temsil edilir. İşleme sırasında sistem aralıkları dolaşır ve her bölüme karşılık gelen nitelikleri uygular. Verimlilik, nitelik değiştirme sayısına bağlıdır — kısa bölümlerde sık değişiklikler işleme süresini artırır.
NSAttributedString nitelikleri, UIKit (iOS) ve AppKit’te (macOS) tanımlanmış sabitlerdir ve her biri metnin görsel stilinin belirli bir yönüyle ilgilidir. Tüm nitelikler NSAttributedString.Key dizeleridir ve değerleri belirli sınıfların nesneleridir. Nitelikler karakter düzeyi (karakterleri etkiler) ve paragraf düzeyi (paragrafları etkiler) olarak ikiye ayrılır.
Karakter düzeyi nitelikleri yazı tipi (NSFontAttributeName), metin rengi (NSForegroundColorAttributeName), arka plan rengi (NSBackgroundColorAttributeName), alt çizgi (NSUnderlineStyleAttributeName), üstü çizili (NSStrikethroughStyleAttributeName), gölge (NSShadowAttributeName) içerir. Paragraf düzeyi nitelikleri, hizalama, girinti, satır aralığı ve sekmeyi kontrol eden NSParagraphStyleAttributeName aracılığıyla ayarlanır.
NSLinkAttributeName metinde tıklanabilir bir bağlantı oluşturur: değer bir URL veya dizedir. Etkileşim etkinleştirilmişse UITextView bu bağlantıları otomatik olarak işler. NSAttachmentAttributeName, metin içinde satır içi öğe olarak görüntülenen bir NSTextAttachment (görüntü) gömmeye olanak tanır. Bu, bir dize içinde simgeler, emojiler veya özel görünümler içeren metin oluşturmak için kullanılır.
Her NSAttributedString niteliğinin sıkı bir şekilde tür belirtilmiş bir değeri vardır. iOS geliştirmede en yaygın kullanılan niteliklere bakalım. Yazı tipi bir UIFont nesnesi aracılığıyla, renk UIColor aracılığıyla, satır aralığı ise tek bir nesnede hizalama, girinti ve boşluk yapılandırmasına izin veren NSMutableParagraphStyle aracılığıyla ayarlanır.
| Nitelik Anahtarı | Değer Türü | Amaç |
|---|---|---|
| NSFontAttributeName | UIFont | Metin yazı tipi |
| NSForegroundColorAttributeName | UIColor | Metin rengi |
| NSBackgroundColorAttributeName | UIColor | Metnin arkasındaki arka plan rengi |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Alt çizgi stili |
| NSParagraphStyleAttributeName | NSParagraphStyle | Paragraf ayarları |
| NSKernAttributeName | NSNumber (Float) | Harf aralığı (kerning) |
NSParagraphStyle, paragraf nitelikleri için bir kapsayıcıdır: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight ve diğerleri. Bu parametreleri değiştirmek için bir NSMutableParagraphStyle oluşturulur, istenen özellikler ayarlanır ve nesne NSParagraphStyleAttributeName niteliğinin değeri olarak iletilir. Bu, NSAttributedString’de satır aralığını kontrol etmenin tek yoludur.
NSShadow metne gölge eklemeye olanak tanır: shadowOffset, shadowBlurRadius, shadowColor parametreleri gölgenin kaymasını, bulanıklığını ve rengini ayarlar. Alt çizgi ve üstü çizili nitelikleri stil kombinasyonlarını kabul eder: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Çizgi kalınlığı ve rengi üzerinde hassas kontrol için NSUnderlineColorAttributeName ve NSStrikethroughColorAttributeName kullanılır.
Swift’te NSAttributedString oluşturma, metin ve bir nitelik sözlüğü içeren bir başlatıcı aracılığıyla veya adım adım stil uygulamasıyla NSMutableAttributedString aracılığıyla yapılır. Temel yaklaşım, tüm metin için bir nitelik sözlüğü tanımlamak ve ardından belirli aralıklar için nitelikler eklemek veya değiştirmektir.
Basit bir örnek — dizenin tamamı için yazı tipi, renk ve hizalama ayarlamak. Nitelik sözlüğü NSAttributedString başlatıcısına iletilir. Sözlük anahtarları NSAttributedString.Key sabitleridir, değerler karşılık gelen UIKit nesneleridir. Bu, tüm metnin tekdüze biçimlendirildiği temel durumdur.
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
Metin systemFont 16, koyu gri renk, orta hizalama ve 4pt satır aralığıyla görüntülenecektir. Bu yaklaşım statik başlıklar ve düğmeler için kullanışlıdır.
NSMutableAttributedString, metnin farklı bölümlerine farklı stiller uygulamaya olanak tanır. addAttribute yöntemi bir aralığa tek bir nitelik ekler, addAttributes bir nitelik sözlüğü ekler. setAttributes yöntemi bir aralığın tüm mevcut niteliklerini yenileriyle değiştirir. Bu, vurgulamalı metin oluşturmak için ana araçtır.
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özcüğü yeşil ve kalın olacak, metnin geri kalanı standart olacaktır. NSRange manuel olarak hesaplanır — özellikle emoji ve bileşik Unicode karakterlerle çalışırken karakter cinsinden uzunluğu doğru saymak önemlidir.
NSMutableAttributedString, metni ve nitelikleri dinamik olarak değiştirmek için yöntemler sağlar: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Bu, farklı kaynaklardan metin oluşturmaya, stilleri birleştirmeye ve arayüz olaylarına yanıt vermeye olanak tanır.
Değiştirilemez NSAttributedString’in aksine, değiştirilebilir sürüm yeni bir nesne oluşturmadan içeriği değiştirmeyi destekler. Bu, kullanıcının metni düzenleyebildiği ve stillerin korunması gereken metin düzenleyiciler, sohbetler ve formlar için kritiktir.
Mesajlaşma uygulamalarında, her mesaj kullanıcı adı (kalın), mesaj metni (normal), saat (gri renk) içerir. NSMutableAttributedString, ilgili niteliklerle birlikte parçaları istenen sırada ekleyerek böyle bir diziyi tek seferde oluşturmaya olanak tanır.
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
Sonuç, üç stillendirilmiş bölüme sahip tek bir dizidir. Append otomatik olarak NSRange’i hesaplar, konumların manuel olarak hesaplanması gerekmez. Bu yaklaşım herhangi bir sayıda parçaya ölçeklenebilir.
enumerateAttributes(in:options:using:) yöntemi, belirtilen aralıktaki tüm nitelik aralıklarını dolaşır. Bu, biçimlendirme analizi için kullanışlıdır: tüm bağlantıları bulma, belirli niteliklerin rengini değiştirme veya metni HTML’ye çıkarma. Closure’a geçerli bölümün nitelik sözlüğü ve NSRange’i iletilir.
UIKit’te metin görüntülemek için tüm ana UI bileşenleri, attributedText özelliği aracılığıyla NSAttributedString’i destekler. UILabel statik stillendirilmiş metin görüntüler, UITextView düzenleme ve bağlantıları destekler, UITextField yer tutucu ve girilen metin için ayrı ayrı nitelikleri kabul eder.
UILabel, stillendirilmiş metin görüntülemek için en hafif bileşendir. Tüm karakter düzeyi niteliklerini destekler ancak tıklanabilir bağlantıları otomatik olarak işlemez (bunun için UITextView gerekir). UILabel başlıklar, etiketler ve kısa biçimlendirilmiş metinler için idealdir.
UITextView, NSLinkAttributeName’i işler ve bağlantıları etkileşimli öğeler olarak görüntüler. Bu işlevselliği etkinleştirmek için isSelectable = true ve isEditable = false olarak ayarlayın. Bir bağlantıya tıklandığında, temsilci textView(_:shouldInteractWith:in:interaction:) çağrısını alır. UITextView ayrıca metin içindeki görseller için NSTextAttachment’ı da destekler.
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 ve isEditable ayarlandıktan sonra metin alanı statik bir metin bloğu gibi davranır ancak bağlantılar etkin kalır. UITextViewDelegate, tıklamadaki davranışı kontrol eder.
Core Text, doğrudan NSAttributedString ile çalışan Apple’ın düşük seviyeli metin işleme çerçevesidir. UIKit’in aksine, Core Text NSAttributedString’i doğrudan bir görüntüleme nesnesi olarak kullanmaz — bunun yerine onu CTFramesetter’a, ardından CTFrame’e dönüştürür ve bir Core Graphics bağlamında işler. Bu, satır düzeni ve glifler üzerinde tam kontrol sağlar.
Core Text kullanımı, özel metin düzenleri için uygundur: sütunlar, görsel sarma, metin döndürme, standart olmayan satır sonları. Core Text’in NSMutableParagraphStyle’ı, UIKit’te bulunmayan nitelikleri içerir: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode ek modlarla.
NSAttributedString, UIKit ve Core Text arasında sorunsuz bir şekilde aktarılır, çünkü her iki çerçeve de aynı türle çalışır. UIKit nitelikleri (NSFontAttributeName, NSForegroundColorAttributeName) Core Text tarafından otomatik olarak tanınır ve bunun tersi de geçerlidir — Core Text nitelikleri (kCTFontAttributeName) UIKit tarafından okunur. Bu, aynı NSAttributedString nesnesinde basit görevler için UIKit’i ve özel işleme için Core Text’i kullanmaya olanak tanır.
Sıkça Sorulan Sorular
NSString yalnızca stil bilgisi olmadan metin depolar. NSAttributedString, her karakter aralığı için bir nitelik sözlüğüyle metni tamamlar. text özelliği aracılığıyla UILabel’e iletildiğinde, NSString düz metin olarak görüntülenir. NSAttributedString attributedText aracılığıyla iletildiğinde, tüm nitelikler uygulanır: tek bir dizide farklı yazı tipleri, renkler ve aralıklar.
Bir nitelik sözlüğüyle addAttributes(_:range:) yöntemini kullanın: addAttributes([.font: font, .foregroundColor: color], range: range). Tek bir nitelik eklemek veya değiştirmek için addAttribute(_:value:range:) kullanın. setAttributes yöntemi, aralıktaki tüm mevcut nitelikleri sağlanan niteliklerle değiştirir.
Bir NSMutableParagraphStyle oluşturun, lineSpacing özelliğini ayarlayın, ardından bunu NSParagraphStyleAttributeName niteliğinin değeri olarak iletin. Tam kontrol için minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode ve alignment da mevcuttur. ParagraphStyle, satır aralığını kontrol etmenin tek yoludur.
Evet, SwiftUI iOS 15+ sürümünde Text(attributedString:) aracılığıyla NSAttributedString’i destekler. Eski sürümlerde UILabel veya UITextView ile UIViewRepresentable kullanın. SwiftUI ayrıca Markdown benzeri sözdizimiyle bildirimsel biçimlendirme için kendi AttributedString türünü (Foundation değil, SwiftUI) sağlar.
boundingRect(with:options:context:) yöntemini kullanın; bu yöntem, verilen niteliklerle diziyi görüntülemek için gereken CGRect’i döndürür. options parametresi: [.usesLineFragmentOrigin, .usesFontLeading] satır aralığını ve yazı tipi metriklerini hesaba katar. Sınırlı satır sayısına sahip UILabel için sizeThatFits kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun