Diese Antwort wurde für Swift 4.2 aktualisiert.
Kurzübersicht
Die allgemeine Form zum Erstellen und Festlegen einer zugewiesenen Zeichenfolge lautet wie folgt. Weitere gängige Optionen finden Sie unten.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
Der Rest dieses Beitrags enthält weitere Details für Interessierte.
Attribute
Zeichenfolgenattribute sind nur ein Wörterbuch in Form von [NSAttributedString.Key: Any]
, wobei NSAttributedString.Key
der Schlüsselname des Attributs und Any
der Wert eines Typs ist. Der Wert kann eine Schriftart, eine Farbe, eine Ganzzahl oder etwas anderes sein. Es gibt viele Standardattribute in Swift, die bereits vordefiniert wurden. Zum Beispiel:
- Schlüsselname :
NSAttributedString.Key.font
, Wert: aUIFont
- Schlüsselname :
NSAttributedString.Key.foregroundColor
, Wert: aUIColor
- Schlüsselname :
NSAttributedString.Key.link
, Wert: ein NSURL
oderNSString
Es gibt viele andere. Siehe diesen Link für mehr. Sie können sogar Ihre eigenen benutzerdefinierten Attribute erstellen wie:
Schlüsselname : NSAttributedString.Key.myName
, Wert: einige Typ.
Wenn Sie eine Erweiterung vornehmen :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Attribute in Swift erstellen
Sie können Attribute wie jedes andere Wörterbuch deklarieren.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Beachten Sie das rawValue
, was für den Unterstreichungsstilwert benötigt wurde.
Da Attribute nur Wörterbücher sind, können Sie sie auch erstellen, indem Sie ein leeres Wörterbuch erstellen und dann Schlüssel-Wert-Paare hinzufügen. Wenn der Wert mehrere Typen enthält, müssen Sie ihn Any
als Typ verwenden. Hier ist das multipleAttributes
Beispiel von oben, das auf diese Weise neu erstellt wurde:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Zugeschriebene Zeichenfolgen
Nachdem Sie die Attribute verstanden haben, können Sie zugeordnete Zeichenfolgen erstellen.
Initialisierung
Es gibt verschiedene Möglichkeiten, zugeordnete Zeichenfolgen zu erstellen. Wenn Sie nur eine schreibgeschützte Zeichenfolge benötigen, können Sie diese verwenden NSAttributedString
. Hier sind einige Möglichkeiten, um es zu initialisieren:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Wenn Sie die Attribute oder den Zeichenfolgeninhalt später ändern müssen, sollten Sie verwenden NSMutableAttributedString
. Die Erklärungen sind sehr ähnlich:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Ändern einer zugeordneten Zeichenfolge
Als Beispiel erstellen wir die zugewiesene Zeichenfolge oben in diesem Beitrag.
Erstellen Sie zunächst ein NSMutableAttributedString
mit einem neuen Schriftattribut.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Wenn Sie mitarbeiten, setzen Sie die zugewiesene Zeichenfolge wie folgt auf UITextView
(oder UILabel
):
textView.attributedText = myString
Sie nicht verwenden textView.text
.
Hier ist das Ergebnis:
Fügen Sie dann eine weitere zugeordnete Zeichenfolge hinzu, für die keine Attribute festgelegt sind. (Beachten Sie, dass ich es let
, obwohl ich es myString
oben deklariert habe , trotzdem ändern kann, weil es ein ist NSMutableAttributedString
. Dies scheint mir ziemlich unkompliziert zu sein, und ich wäre nicht überrascht, wenn sich dies in Zukunft ändert. Hinterlassen Sie mir in diesem Fall einen Kommentar.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Als nächstes wählen wir einfach das Wort "Strings" aus, das am Index beginnt 17
und eine Länge von hat 7
. Beachten Sie, dass dies ein NSRange
und kein Swift ist Range
. (Weitere Informationen zu Bereichen finden Sie in dieser Antwort .) Mit dieser addAttribute
Methode können wir den Attributschlüsselnamen an die erste Stelle, den Attributwert an die zweite Stelle und den Bereich an die dritte Stelle setzen.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Zuletzt fügen wir eine Hintergrundfarbe hinzu. Verwenden Sie für Abwechslung die addAttributes
Methode (beachten Sie die s
). Ich könnte mit dieser Methode mehrere Attribute gleichzeitig hinzufügen, aber ich werde nur noch eines hinzufügen.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Beachten Sie, dass sich die Attribute an einigen Stellen überlappen. Durch das Hinzufügen eines Attributs wird ein bereits vorhandenes Attribut nicht überschrieben.
verbunden
Weiterführende Literatur
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
textView.atrributedtText = myString
odermyLabel.attributedText = myString
am Anfang Ihrer Antwort platzieren. Als Neuling habe ich es gerade getanmyLabel.text
und dachte nicht, dass ich all deine Antworten durchgehen müsste . ** 3) ** Bedeutet das, dass du nur eines haben kannstattributedText
odertext
dass es bedeutungslos wäre, beide zu haben? 4) Ich empfehle, dass Sie auch einlineSpacing
Beispiel wie dieses in Ihre Antwort aufnehmen, da es sehr nützlich ist. 5) ачаар дахинappendAttributedString
ist wie 'String-Verkettung'.addAttribute
fügt Ihrer Zeichenfolge ein neues Attribut hinzu.addAttribute
ist eine Methode vonNSMutableAttributedString
. Sie haben Recht, dass Sie es nicht mitString
oder verwenden könnenNSAttributedString
. (Überprüfen Sie diemyString
Definition im Abschnitt Ändern einermyString
NSAttributedString
Swift verwendet dasselbe
NSMutableAttributedString
wie Obj-C. Sie instanziieren es, indem Sie den berechneten Wert als Zeichenfolge übergeben:Erstellen Sie nun die zugeordnete
g
Zeichenfolge (heh). Hinweis:UIFont.systemFontOfSize(_)
ist jetzt ein fehlerhafter Initialisierer, daher muss er entpackt werden, bevor Sie ihn verwenden können:Und dann anhängen:
Sie können dann das UILabel so einstellen, dass der NSAttributedString wie folgt angezeigt wird:
quelle
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes)
Wenn ich mein UILabel.text = CoffeeText setze, erhalte ich die Fehlermeldung "NSMutableAttributedString kann nicht in 'String' konvertiert werden. Gibt es eine Möglichkeit, das UILabel dazu zu bringen, NSMutableAttributedString zu akzeptieren?Xcode 6 Version :
Xcode 9.3 Version :
Xcode 10, iOS 12, Swift 4 :
quelle
Swift 4:
quelle
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Ich würde wärmstens empfehlen, eine Bibliothek für zugeordnete Zeichenfolgen zu verwenden. Es macht es viel einfacher, wenn Sie beispielsweise eine Zeichenfolge mit vier verschiedenen Farben und vier verschiedenen Schriftarten möchten. Hier ist mein Favorit. Es heißt SwiftyAttributes
Wenn Sie mit SwiftyAttributes eine Zeichenfolge mit vier verschiedenen Farben und verschiedenen Schriftarten erstellen möchten:
finalString
würde zeigen alsquelle
Swift: xcode 6.1
quelle
Der beste Weg, um Attributed Strings unter iOS zu erreichen, ist die Verwendung des integrierten Attributed Text-Editors im Interface Builder und die Vermeidung unnötiger Hardcodierung von NSAtrributedStringKeys in Ihren Quelldateien.
Sie können Placehoderls später zur Laufzeit dynamisch ersetzen, indem Sie diese Erweiterung verwenden:
Fügen Sie ein Storyboard-Label mit zugeordnetem Text hinzu, der so aussieht.
Dann aktualisieren Sie den Wert einfach jedes Mal, wenn Sie Folgendes benötigen:
Stellen Sie sicher, dass Sie den ursprünglichen Wert in initalAttributedString speichern.
Sie können diesen Ansatz besser verstehen, indem Sie diesen Artikel lesen: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
quelle
let nsRange = NSRange(range,in:valueString)
Leitung ab.Swift 2.0
Hier ist ein Beispiel:
Swift 5.x.
ODER
quelle
Funktioniert gut in Beta 6
quelle
Ich habe ein Online-Tool erstellt, das Ihr Problem lösen wird! Sie können Ihre Zeichenfolge schreiben und Stile grafisch anwenden. Das Tool bietet Ihnen Ziel-C und schnellen Code zum Generieren dieser Zeichenfolge.
Ist auch Open Source, also zögern Sie nicht, es zu erweitern und PRs zu senden.
Transformator-Werkzeug
Github
quelle
//Implementierung
quelle
Swift 5 und höher
quelle
Swift 4
Sie müssen den Rohwert in Swift 4 entfernen
quelle
Für mich haben die oben genannten Lösungen beim Festlegen einer bestimmten Farbe oder Eigenschaft nicht funktioniert.
Das hat funktioniert:
quelle
Swift 2.1 - Xcode 7
quelle
Verwenden Sie diesen Beispielcode. Dies ist ein sehr kurzer Code, um Ihre Anforderung zu erfüllen. Das funktioniert bei mir.
quelle
quelle
Die Attribute können direkt in Swift 3 ...
Verwenden Sie dann die Variable in einer beliebigen Klasse mit Attributen
quelle
Swift 4.2
quelle
Einzelheiten
Lösung
Verwendungszweck
Vollständiges Beispiel
Ergebnis
quelle
Mit der von mir erstellten Bibliothek können Sie Ihr Problem ganz einfach lösen. Es heißt Atributika.
Sie finden es hier https://github.com/psharanda/Atributika
quelle
quelle
Swifter Swift hat eine ziemlich süße Art, dies ohne Arbeit zu tun. Geben Sie einfach das Muster an, das übereinstimmen soll, und welche Attribute darauf angewendet werden sollen. Sie sind großartig für viele Dinge, die sie ausprobieren.
Wenn Sie mehrere Stellen haben, an denen dies angewendet wird, und Sie möchten, dass dies nur für bestimmte Instanzen geschieht, funktioniert diese Methode nicht.
Sie können dies in einem Schritt tun, der beim Trennen einfacher zu lesen ist.
quelle
Swift 4.x.
quelle
Swift 3.0 // Attributzeichenfolge erstellen
Definieren Sie Attribute wie
quelle
Bitte erwägen Sie die Verwendung von Prestyler
quelle
Swift 5
quelle
}}
// Benutze es wie unten
quelle