Verwenden Sie mehrere Schriftfarben in einem Etikett


86

Gibt es in iOS eine Möglichkeit, zwei oder sogar drei Schriftfarben in einem einzigen Etikett zu verwenden?

Wenn der Text "Hallo, wie geht es dir?" Als Beispiel verwendet würde, wäre das "Hallo" blau und das "Wie geht es dir?" Grün?

Ist dies möglich, scheint es einfacher zu sein, als mehrere Etiketten zu erstellen?


Versuchen Sie, die zugewiesene Texteigenschaft des UILabel zu verwenden. stackoverflow.com/questions/3586871/…
Rakeshbs

Sie möchten hinzufügen, um Bereich Farbe in Zeichenfolge
Kirit Modi

Antworten:


149

Referenz von hier.

Initialisieren Sie zunächst NSString und NSMutableAttributedString wie folgt .

var myString:NSString = "I AM KIRIT MODI"
var myMutableString = NSMutableAttributedString()

In ViewDidLoad

override func viewDidLoad() {

    myMutableString = NSMutableAttributedString(string: myString, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!])
    myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))
    // set label Attribute
    labName.attributedText = myMutableString
    super.viewDidLoad()
}

AUSGABE

Geben Sie hier die Bildbeschreibung ein

MEHRFACHE FARBE

Fügen Sie den folgenden Zeilencode in ViewDidLoad ein, um mehrere Farben in einer Zeichenfolge zu erhalten.

 myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location:10,length:5))

Mehrfarbenausgang

Geben Sie hier die Bildbeschreibung ein

Swift 4

var myMutableString = NSMutableAttributedString(string: str, attributes: [NSAttributedStringKey.font :UIFont(name: "Georgia", size: 18.0)!])
myMutableString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: NSRange(location:2,length:4))

1
Können Sie zwei Bereichseigenschaften hinzufügen? Wenn nicht, wie kann ich das umgehen?
Justin Rose

55

Für @Hems Moradiya

Geben Sie hier die Bildbeschreibung ein

let attrs1 = [NSFontAttributeName : UIFont.boldSystemFontOfSize(18), NSForegroundColorAttributeName : UIColor.greenColor()]

let attrs2 = [NSFontAttributeName : UIFont.boldSystemFontOfSize(18), NSForegroundColorAttributeName : UIColor.whiteColor()]

let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

attributedString1.appendAttributedString(attributedString2)
self.lblText.attributedText = attributedString1

Swift 4

    let attrs1 = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedStringKey.foregroundColor : UIColor.green]

    let attrs2 = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedStringKey.foregroundColor : UIColor.white]

    let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

    let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

    attributedString1.append(attributedString2)
    self.lblText.attributedText = attributedString1

Swift 5

    let attrs1 = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedString.Key.foregroundColor : UIColor.green]

    let attrs2 = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedString.Key.foregroundColor : UIColor.white]

    let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

    let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

    attributedString1.append(attributedString2)
    self.lblText.attributedText = attributedString1

36

Swift 4

Mit der folgenden Erweiterungsfunktion können Sie ein Farbattribut direkt auf eine zugeordnete Zeichenfolge festlegen und dasselbe auf Ihre Beschriftung anwenden.

extension NSMutableAttributedString {

    func setColorForText(textForAttribute: String, withColor color: UIColor) {
        let range: NSRange = self.mutableString.range(of: textForAttribute, options: .caseInsensitive)

        // Swift 4.2 and above
        self.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)

        // Swift 4.1 and below
        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

Versuchen Sie die obige Erweiterung mit einem Etikett:

let label = UILabel()
label.frame = CGRect(x: 60, y: 100, width: 260, height: 50)
let stringValue = "stackoverflow"

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColorForText(textForAttribute: "stack", withColor: UIColor.black)
attributedString.setColorForText(textForAttribute: "over", withColor: UIColor.orange)
attributedString.setColorForText(textForAttribute: "flow", withColor: UIColor.red)
label.font = UIFont.boldSystemFont(ofSize: 40)

label.attributedText = attributedString
self.view.addSubview(label)

Ergebnis:

Geben Sie hier die Bildbeschreibung ein


@Krunal Wie kann dies geändert werden, um mehrere Zeichenfolgen zum Ändern der Farben zu unterstützen ...? Ich habe eine lange Zeichenfolge mit untergeordneten Überschriften mit ------------, aber der obige Code funktioniert einwandfrei, färbt jedoch nur die zuerst gefundene. Kann dies geändert werden, um alle --------- Zeichenfolgen auf eine bestimmte Farbe zu bringen ....? Vielen Dank.
Omid CompSCI

Dies wird für Text wie diesen nicht funktionieren: "flowstackoverflow" Es wird nur den ersten Fluss ändern, aber wir brauchen den letzten, wie kann man das erreichen?
swift2geek

19

Aktualisierte Antwort für Swift 4

Sie können HTML problemlos in der Eigenschaft attributeText des UILabel verwenden, um auf einfache Weise verschiedene Textformatierungen vorzunehmen.

 let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

    let encodedData = htmlString.data(using: String.Encoding.utf8)!
    let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
    do {
        let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
        label.attributedText = attributedString

    } catch _ {
        print("Cannot create attributed String")
    }

Geben Sie hier die Bildbeschreibung ein

Aktualisierte Antwort für Swift 2

let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

let encodedData = htmlString.dataUsingEncoding(NSUTF8StringEncoding)!
let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
do {
    let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
    label.attributedText = attributedString

} catch _ {
    print("Cannot create attributed String")
}

2
Ich habe folgende Fehlermeldung erhalten: Initialisierer für Typ 'NSAttributedString' kann nicht mit einer Argumentliste vom Typ 'aufgerufen werden (Daten: NSData, Optionen: [String: String], documentAttributes: _, Fehler: _)'
Qian Chen

2
Es gibt Änderungen in Swift 2. Bitte überprüfen Sie meine aktualisierte Antwort.
Rakeshbs

8

Hier eine Lösung für Swift 5

let label = UILabel()
let text = NSMutableAttributedString()
text.append(NSAttributedString(string: "stack", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white]));
text.append(NSAttributedString(string: "overflow", attributes: [NSAttributedString.Key.foregroundColor: UIColor.gray]))
label.attributedText = text

Geben Sie hier die Bildbeschreibung ein


7

Verwendete die Antwort von Rakeshbs , um eine Erweiterung in Swift 2 zu erstellen:

// StringExtension.swift
import UIKit
import Foundation

extension String {

    var attributedStringFromHtml: NSAttributedString? {
        do {
            return try NSAttributedString(data: self.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
        } catch _ {
            print("Cannot create attributed String")
        }
        return nil
    }
}

Verwendung:

let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"
label.attributedText = htmlString.attributedStringFromHtml

Oder auch für Einzeiler

label.attributedText = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>".attributedStringFromHtml

Das Gute an der Erweiterung ist, dass Sie in Ihrer gesamten Anwendung .attributedStringFromHtmlAttribute für alle Strings haben.


6

Mir hat es so gefallen

let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: UIFont.systemFontOfSize(15)]
let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: UIFont.systemFontOfSize(25)]

let partOne = NSMutableAttributedString(string: "This is an example ", attributes: yourAttributes)
let partTwo = NSMutableAttributedString(string: "for the combination of Attributed String!", attributes: yourOtherAttributes)

let combination = NSMutableAttributedString()

combination.appendAttributedString(partOne)
combination.appendAttributedString(partTwo) 

Danke für diesen einfachen.
Nikhil Manapure

6

UPDATE für SWIFT 5

func setDiffColor(color: UIColor, range: NSRange) {
     let attText = NSMutableAttributedString(string: self.text!)
     attText.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
     attributedText = attText
}

SWIFT 3

In meinem Code erstelle ich eine Erweiterung

import UIKit
import Foundation

extension UILabel {
    func setDifferentColor(string: String, location: Int, length: Int){

        let attText = NSMutableAttributedString(string: string)
        attText.addAttribute(NSForegroundColorAttributeName, value: UIColor.blueApp, range: NSRange(location:location,length:length))
        attributedText = attText

    }
}

und dies zur Verwendung

override func viewDidLoad() {
        super.viewDidLoad()

        titleLabel.setDifferentColor(string: titleLabel.text!, location: 5, length: 4)

    }


5

Swift 3.0

let myMutableString = NSMutableAttributedString(
                            string: "your desired text",
                            attributes: [:])

myMutableString.addAttribute(
                            NSForegroundColorAttributeName,
                            value: UIColor.blue,
                            range: NSRange(
                                location:6,
                                length:7))

Ergebnis:

Für mehr Farben können Sie der veränderlichen Zeichenfolge einfach weiterhin Attribute hinzufügen. Weitere Beispiele hier .


1

Swift 4 UILabel-Erweiterung

In meinem Fall musste ich in der Lage sein, häufig verschiedene Farben / Schriftarten innerhalb von Beschriftungen festzulegen , damit ich eine UILabel-Erweiterung mit der Erweiterung NSMutableAttributedString von Krunal erstellen konnte.

func highlightWords(phrases: [String], withColor: UIColor?, withFont: UIFont?) {

    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!)

    for phrase in phrases {

        if withColor != nil {
            attributedString.setColorForText(textForAttribute: phrase, withColor: withColor!)
        }
        if withFont != nil {
            attributedString.setFontForText(textForAttribute: phrase, withFont: withFont!)
        }

    }

    self.attributedText = attributedString

}

Es kann folgendermaßen verwendet werden:

yourLabel.highlightWords(phrases: ["hello"], withColor: UIColor.blue, withFont: nil)
yourLabel.highlightWords(phrases: ["how are you"], withColor: UIColor.green, withFont: nil)

1

Verwenden Sie Cocoapod Prestyler :

Prestyle.defineRule("*", Color.blue)
Prestyle.defineRule("_", Color.red)
label.attributedText = "*This text is blue*, _but this one is red_".prestyled()

0

Swift 3 Beispiel mit der HTML-Version.

let encodedData = htmlString.data(using: String.Encoding.utf8)!
            let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
            do {
                let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
                label.attributedText = attributedString
            } catch _ {
                print("Cannot create attributed String")
            }

0

Hier ist der Code, der die neueste Version von Swift ab März 2017 unterstützt.

Swift 3.0

Hier habe ich eine Helper-Klasse und -Methode für die erstellt

public class Helper {

static func GetAttributedText(inputText:String, location:Int,length:Int) -> NSMutableAttributedString {
        let attributedText = NSMutableAttributedString(string: inputText, attributes: [NSFontAttributeName:UIFont(name: "Merriweather", size: 15.0)!])
        attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0) , range: NSRange(location:location,length:length))
       return attributedText
    }
}

In den Methodenparametern inputText: String - Ihr Text, der an der Beschriftungsposition angezeigt werden soll: Int - wobei der Stil Anwendung sein soll, "0" als Anfang der Zeichenfolge oder ein gültiger Wert als Zeichenposition der Zeichenfolgenlänge: Int - From die Position bis zu wie vielen Zeichen dieser Stil anwendbar ist.

Konsumieren mit anderer Methode:

self.dateLabel?.attributedText = Helper.GetAttributedText(inputText: "Date : " + (self.myModel?.eventDate)!, location:0, length: 6)

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Hinweis: Die UI-Farbe kann als Farbe UIColor.redoder benutzerdefinierte Farben als definiert werdenUIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0)


0
func MultiStringColor(first:String,second:String) -> NSAttributedString
    {
        let MyString1 = [NSFontAttributeName : FontSet.MonsRegular(size: 14), NSForegroundColorAttributeName : FoodConstant.PUREBLACK]

        let MyString2 = [NSFontAttributeName : FontSet.MonsRegular(size: 14), NSForegroundColorAttributeName : FoodConstant.GREENCOLOR]

        let attributedString1 = NSMutableAttributedString(string:first, attributes:MyString1)

        let attributedString2 = NSMutableAttributedString(string:second, attributes:MyString2)

        MyString1.append(MyString2)

        return MyString1
    }

0

Wenn Sie diesen NSForegroundColorAttributeName in einer schnell niedrigeren Version verwenden, können Sie ungelöste Bezeichnerprobleme erhalten. Ändern Sie die obigen Angaben in NSAttributedStringKey.foregroundColor .

             swift lower version                swift latest version

dh NSForegroundColorAttributeName == NSAttributedStringKey.foregroundColor


0

Swift 4.2

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center

    var stringAlert = self.phoneNumber + "로\r로전송인증번호를입력해주세요"
    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringAlert, attributes: [NSAttributedString.Key.paragraphStyle:paragraphStyle,  .font: UIFont(name: "NotoSansCJKkr-Regular", size: 14.0)])
    attributedString.setColorForText(textForAttribute: self.phoneNumber, withColor: UIColor.init(red: 1.0/255.0, green: 205/255.0, blue: 166/255.0, alpha: 1) )
    attributedString.setColorForText(textForAttribute: "로\r로전송인증번호를입력해주세요", withColor: UIColor.black)

    self.txtLabelText.attributedText = attributedString

Ergebnis

Ergebnis

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.