Attributed Text az iOS SDK mechanizmusa, amelyet az NSAttributedString és NSMutableAttributedString osztályok képviselnek, és lehetővé teszi több stílus alkalmazását egy szöveges karakterlánc különböző részeire. A hagyományos NSString-től eltérően az Attributed String nemcsak karaktereket, hanem attribútumok szótárát is tárolja minden tartományhoz: betűtípus, szín, sorköz, árnyék és igazítás. A Apple Developer Documentation szerint az Attributed String a formázott szöveg megjelenítésének alapja UILabel, UITextView és UITextField esetén. Ez a szabványos módja a szöveg stílusozásának WebKit vagy külső könyvtárak nélkül.
Főbb pontok
NSAttributedString a Foundation keretrendszer osztálya, amely egy karakterláncot reprezentál karaktertartományokhoz kötött elnevezett attribútumok halmazával. Minden attribútum egy kulcs-érték pár: a kulcsot egy konstans (NSFontAttributeName, NSForegroundColorAttributeName), az értéket pedig egy megfelelő objektum (UIFont, UIColor) határozza meg. Az attribútumok NSRange-en keresztül kerülnek alkalmazásra egy karaktertartományra.
Az osztály az összes Apple platformon elérhető: iOS (2.0+), macOS, tvOS, watchOS. Az NSAttributedString megváltoztathatatlan — létrehozás után attribútumai rögzítettek. Dinamikus módosításhoz az NSMutableAttributedString használatos, amely az NSAttributedString-ből származik és hozzáadja a setAttributes, addAttributes, addAttribute, removeAttribute metódusokat.
NSString egy egyszerű karakterlánc stílusinformáció nélkül. Bármely szöveg, amelyet text-en keresztül UILabel-nek adunk át, egyetlen betűtípussal, színnel és mérettel jelenik meg. Az attributedText-en keresztül átadott NSAttributedString lehetővé teszi, hogy minden karakternek saját attribútumkészlete legyen. Az UILabel, UITextView és UITextField automatikusan felismeri az NSAttributedString-t és a szöveget az attribútumoknak megfelelően jeleníti meg.
Belsőleg az NSAttributedString egy NSString-t tárol a szöveggel és attribútumtartományok tömbjét. Minden tartományt egy NSRange struktúra és egy attribútumszótár reprezentál. Megjelenítéskor a rendszer végighalad a tartományokon és alkalmazza a megfelelő attribútumokat minden részre. A hatékonyság az attribútumváltások számától függ — gyakori váltások rövid szakaszokon növelik a megjelenítési időt.
NSAttributedString attribútumai a UIKit (iOS) és AppKit (macOS) által definiált konstansok, amelyek mindegyike a szöveg vizuális formázásának egy meghatározott aspektusának felel meg. Minden attribútum NSAttributedString.Key karakterlánc, értékeik pedig meghatározott osztályok objektumai. Az attribútumok karakter (karakterekre hatnak) és bekezdés (bekezdésekre hatnak) típusúakra oszlanak.
Karakter attribútumok tartalmazzák a betűtípust (NSFontAttributeName), szöveg színét (NSForegroundColorAttributeName), háttérszínét (NSBackgroundColorAttributeName), aláhúzást (NSUnderlineStyleAttributeName), áthúzást (NSStrikethroughStyleAttributeName), árnyékot (NSShadowAttributeName). Bekezdés attribútumok az NSParagraphStyleAttributeName-en keresztül kerülnek beállításra, amely az igazítást, behúzásokat, sorközt és tabulálást vezérli.
NSLinkAttributeName kattintható linket hoz létre a szövegben: az érték egy URL vagy karakterlánc. Az UITextView automatikusan feldolgozza az ilyen linkeket, ha az interakció engedélyezve van. Az NSAttachmentAttributeName lehetővé teszi NSTextAttachment beágyazását — egy képet a szövegben, amely inline elemként jelenik meg. Ez ikonokkal, emojikkal vagy egyedi nézetekkel ellátott szövegek létrehozására használatos a karakterláncon belül.
Minden NSAttributedString attribútumnak szigorúan tipizált értéke van. Nézzük meg a leggyakrabban használt attribútumokat iOS fejlesztésben. A betűtípust UIFont objektum, a színt UIColor, a sorközt NSMutableParagraphStyle állítja be, amely lehetővé teszi az igazítás, behúzások és távolságok egy objektumban történő konfigurálását.
| Attribútum kulcs | Érték típusa | Cél |
|---|---|---|
| NSFontAttributeName | UIFont | Szöveg betűtípusa |
| NSForegroundColorAttributeName | UIColor | Szöveg színe |
| NSBackgroundColorAttributeName | UIColor | Háttérszín a szöveg alatt |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Aláhúzás stílusa |
| NSParagraphStyleAttributeName | NSParagraphStyle | Bekezdés beállítások |
| NSKernAttributeName | NSNumber (Float) | Betűköz |
NSParagraphStyle egy konténer a bekezdés attribútumokhoz: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight és mások. Ezen paraméterek módosításához létrehozunk egy NSMutableParagraphStyle-t, beállítjuk a kívánt tulajdonságokat, és az objektumot átadjuk az NSParagraphStyleAttributeName attribútum értékeként. Ez az egyetlen módja a sorköz vezérlésének az NSAttributedString-ben.
NSShadow lehetővé teszi árnyék hozzáadását a szöveghez: a shadowOffset, shadowBlurRadius, shadowColor paraméterek az árnyék elmozdulását, elmosását és színét állítják be. Az aláhúzás és áthúzás attribútumok stílusok kombinációit fogadják el: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. A vonalak vastagságának és színének pontos vezérléséhez az NSUnderlineColorAttributeName és NSStrikethroughColorAttributeName használatos.
Az NSAttributedString létrehozása Swift-ben az inicializátoron keresztül történik a szöveg és attribútumszótár megadásával, vagy NSMutableAttributedString-en keresztül lépésről lépésre történő stílusalkalmazással. Az alapvető megközelítés — attribútumszótár definiálása a teljes szöveghez, majd attribútumok hozzáadása vagy módosítása egyes tartományokhoz.
Egyszerű példa — betűtípus, szín és igazítás beállítása a teljes karakterlánchoz. Az attribútumszótár átadásra kerül az NSAttributedString inicializátorának. A szótár kulcsai NSAttributedString.Key konstansok, az értékek megfelelő UIKit objektumok. Ez az alapváltozat, amikor a teljes szöveg egységesen van formázva.
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
A szöveg systemFont 16 betűtípussal, sötétszürke színnel, középre igazítással és 4pt sorközzel jelenik meg. Ez a megközelítés kényelmes statikus fejlécekhez és gombokhoz.
NSMutableAttributedString lehetővé teszi különböző stílusok alkalmazását a szöveg különböző részeire. Az addAttribute metódus egy attribútumot ad egy tartományhoz, az addAttributes — attribútumszótárat. A setAttributes metódus a tartomány összes attribútumát újakra cseréli. Ez a fő eszköz kiemelésekkel ellátott szöveg létrehozásához.
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
Az „1999“ szó zöld és félkövér lesz, a többi szöveg — szabványos. Az NSRange manuálisan kerül kiszámításra — fontos a hossz helyes számolása karakterekben, különösen emojik és összetett Unicode karakterek esetén.
NSMutableAttributedString metódusokat biztosít a szöveg és attribútumok dinamikus módosításához: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Ez lehetővé teszi szöveg építését különböző forrásokból, stílusok kombinálását és felületi eseményekre való reagálást.
A megváltoztathatatlan NSAttributedString-től eltérően a mutable verzió támogatja a tartalom módosítását új objektum létrehozása nélkül. Ez kritikus szövegszerkesztők, chatek és űrlapok esetén, ahol a felhasználó szerkesztheti a szöveget, és a stílusokat meg kell őrizni.
Az üzenetküldő alkalmazásokban minden üzenet tartalmazza a felhasználónevet (félkövér betűtípus), az üzenet szövegét (normál), az időt (szürke szín). Az NSMutableAttributedString lehetővé teszi egy ilyen karakterlánc egy menetben történő felépítését, a részek megfelelő sorrendben, a megfelelő attribútumokkal történő hozzáadásával.
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
Az eredmény — egy karakterlánc három stílusos résszel. Az Append automatikusan helyesen számolja ki az NSRange-t, a pozíciókat nem kell manuálisan kiszámítani. Ez a megközelítés bármilyen számú töredékre skálázható.
Az enumerateAttributes(in:options:using:) metódus végigmegy az összes attribútumtartományon a megadott intervallumban. Ez hasznos a formázás elemzéséhez: az összes link megtalálása, bizonyos attribútumok színének megváltoztatása vagy szöveg exportálása HTML-be. A lezárásban az attribútumszótár és az aktuális rész NSRange-je kerül átadásra.
Az összes alapvető UI komponens szöveg megjelenítéséhez a UIKit-ben támogatja az NSAttributedString-t az attributedText tulajdonságon keresztül. Az UILabel statikus stílusos szöveget jelenít meg, az UITextView támogatja a szerkesztést és linkeket, az UITextField külön fogadja el az attribútumokat a helyőrző és a bevitt szöveg számára.
UILabel a legkönnyebb komponens stílusos szöveg megjelenítéséhez. Támogatja az összes karakter attribútumot, de nem dolgozza fel automatikusan a kattintható linkeket (ehhez UITextView szükséges). Az UILabel ideális fejlécekhez, címkékhez és rövid, formázott szövegekhez.
UITextView feldolgozza az NSLinkAttributeName-t és a linkeket interaktív elemekként jeleníti meg. A funkció engedélyezéséhez állítsa be az isSelectable = true és isEditable = false értékeket. Linkre kattintva a delegált megkapja a textView(_:shouldInteractWith:in:interaction:) hívást. Az UITextView támogatja az NSTextAttachment-t is képekhez a szövegben.
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
Az isSelectable és isEditable beállítása után a szövegterület statikus szövegblokkként viselkedik, de a linkek aktívak maradnak. Az UITextViewDelegate delegált kezeli a kattintáskori viselkedést.
Core Text az Apple alacsony szintű keretrendszere szöveg megjelenítéséhez, amely közvetlenül az NSAttributedString-tel dolgozik. A UIKit-től eltérően a Core Text nem használja közvetlenül az NSAttributedString-t megjelenítendő objektumként, hanem CTFramesetter-ré, majd CTFrame-ré alakítja, és Core Graphics kontextusban jeleníti meg. Ez teljes irányítást ad a sorok és glifek elhelyezése felett.
A Core Text használata egyedi szöveg elrendezésekhez indokolt: oszlopok, képek körülfolyása, szöveg forgatása, nem szabványos sortörések. A Core Text NSMutableParagraphStyle-ja olyan attribútumokat tartalmaz, amelyek a UIKit-ben nem léteznek: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode további módokkal.
NSAttributedString zökkenőmentesen átvihető a UIKit és Core Text között, mivel mindkét keretrendszer ugyanazzal a típussal dolgozik. A UIKit attribútumok (NSFontAttributeName, NSForegroundColorAttributeName) automatikusan felismerésre kerülnek a Core Text által és fordítva — a Core Text attribútumok (kCTFontAttributeName) olvashatóak a UIKit által. Ez lehetővé teszi a UIKit használatát egyszerű feladatokhoz és a Core Text használatát egyedi megjelenítéshez ugyanazon az NSAttributedString objektumon.
Gyakran ismételt kérdések
NSString csak szöveget tárol stílusinformáció nélkül. Az NSAttributedString kiegészíti a szöveget egy attribútumszótárral minden karaktertartományhoz. Az UILabel-nek a text tulajdonságon keresztül átadva az NSString egyszerű szövegként jelenik meg. Az NSAttributedString-t az attributedText tulajdonságon keresztül átadva az összes attribútum alkalmazásra kerül: különböző betűtípusok, színek és távolságok egy karakterláncon belül.
Használja az addAttributes(_:range:) metódust attribútumszótárral: addAttributes([.font: font, .foregroundColor: color], range: range). Egy attribútum hozzáadásához vagy módosításához használja az addAttribute(_:value:range:) metódust. A setAttributes metódus a tartomány összes meglévő attribútumát újakra cseréli.
Hozzon létre egy NSMutableParagraphStyle-t, állítsa be a lineSpacing tulajdonságot, majd adja át az NSParagraphStyleAttributeName attribútum értékeként. Teljes irányításhoz elérhető még a minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode és alignment is. A ParagraphStyle az egyetlen módja a sorköz vezérlésének.
Igen, a SwiftUI támogatja az NSAttributedString-t a Text(attributedString:) segítségével iOS 15+-ban. Régebbi verziókban használjon UIViewRepresentable-t UILabel vagy UITextView elemekkel. A SwiftUI saját AttributedString típust is biztosít (SwiftUI, nem Foundation) deklaratív formázáshoz Markdown-szerű szintaxissal.
Használja a boundingRect(with:options:context:) metódust, amely visszaadja a megadott attribútumokkal rendelkező karakterlánc megjelenítéséhez szükséges CGRect-et. Az options: [.usesLineFragmentOrigin, .usesFontLeading] paraméter figyelembe veszi a sorközöket és betűmértékeket. Korlátozott sorszámú UILabel esetén használja a sizeThatFits metódust.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is