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?

Justin Rose
quelle
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))
Kirit Modi
quelle
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
Keyur Hirani
quelle
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
quelle
@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")
}
Rakeshbs
quelle
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

Paul Wasilewski
quelle
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.

Mathielo
quelle
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) 
Jithin
quelle
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)

    }
Ridho Octanio
quelle
5

Gebrauch machen von NSMutableAttributedString

myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))

Geben Sie hier die Bildbeschreibung ein

Sehen Sie mehr Details hier schnellfüßigen mit zuzuschreibenden-strings

Shamsudheen TK
quelle
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 .

Cilvet
quelle
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)
Pablo Garces
quelle
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()
Kruiller
quelle
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")
            }
spogebob92
quelle
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)

BHUVANESH MOHANKUMAR
quelle
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
    }
Arun
quelle
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

Veerendra
quelle
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

Tung Tran
quelle