UILabel mit Text in zwei verschiedenen Farben

109

Ich möchte eine Zeichenfolge wie diese in einem anzeigen UILabel:

Es gibt 5 Ergebnisse.

Dabei ist die Nummer 5 rot und der Rest der Zeichenfolge schwarz.

Wie kann ich das im Code machen?

Peter
quelle
6
@EmptyStack Dies ist sicherlich nicht der Fall, da iOS 4 NSAttributedString unterstützt. Siehe meine Antwort unten.
Mic Pringle

Antworten:

223

Der Weg, dies zu tun, ist NSAttributedStringwie folgt zu verwenden :

NSMutableAttributedString *text = 
 [[NSMutableAttributedString alloc] 
   initWithAttributedString: label.attributedText];

[text addAttribute:NSForegroundColorAttributeName 
             value:[UIColor redColor] 
             range:NSMakeRange(10, 1)];
[label setAttributedText: text];

Ich habe dafür eine UILabel Erweiterung erstellt .

João Costa
quelle
Kann ich Ziele hinzufügen? Thnaks
UserDev
Ich habe gerade Ihre Erweiterung zu meinem Projekt hinzugefügt! Vielen Dank!
Zeb
Schöne Kategorie für UILabel. Vielen Dank. Dies sollte die akzeptierte Antwort sein.
Pradeep Reddy Kypa
63

Ich habe dies getan, indem ich ein categoryfür erstellt habeNSMutableAttributedString

-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color
{
    NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];

    if (range.location != NSNotFound) {
        [self addAttribute:NSForegroundColorAttributeName value:color range:range];
    }
}

Verwenden Sie es wie

- (void) setColoredLabel
{
    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Here is a red blue and green text"];
    [string setColorForText:@"red" withColor:[UIColor redColor]];
    [string setColorForText:@"blue" withColor:[UIColor blueColor]];
    [string setColorForText:@"green" withColor:[UIColor greenColor]];
    mylabel.attributedText = string;
}

SWIFT 3

extension NSMutableAttributedString{
    func setColorForText(_ textToFind: String, with color: UIColor) {
        let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
        if range.location != NSNotFound {
            addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        }
    }
}

VERWENDUNG

func setColoredLabel() {
    let string = NSMutableAttributedString(string: "Here is a red blue and green text")
    string.setColorForText("red", with: #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1))
    string.setColorForText("blue", with: #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1))
    string.setColorForText("green", with: #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1))
    mylabel.attributedText = string
}

SWIFT 4 @ kj13 Vielen Dank für Ihre Benachrichtigung

// If no text is send, then the style will be applied to full text
func setColorForText(_ textToFind: String?, with color: UIColor) {

    let range:NSRange?
    if let text = textToFind{
        range = self.mutableString.range(of: text, options: .caseInsensitive)
    }else{
        range = NSMakeRange(0, self.length)
    }
    if range!.location != NSNotFound {
        addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range!)
    }
}

Ich habe mehr Experimente mit Attributen durchgeführt und unten sind die Ergebnisse, hier ist der SOURCECODE

Hier ist das Ergebnis

Stile

anoop4real
quelle
2
Sie benötigen eine neue Kategorie für NSMutableAttributedString mit dem Verfahren zu schaffen ... irgendwie habe ich diese Probe zu GitHub, können Sie es packen und überprüfen github.com/anoop4real/NSMutableAttributedString-Color
anoop4real
Aber ich muss die Farbe aller Alphabete mit Incasesensitive in einer Zeichenfolge einstellen ... wie alle "e" in roter Farbe der gesamten Zeichenfolge
Ravi Ojha
Keine sichtbare @ Schnittstelle für 'NSMutableAttributedString' deklariert den Selektor 'setColorForText: withColor:'
ekashking
1
Ich habe den Fehler 'Verwendung des nicht aufgelösten Bezeichners' NSForegroundColorAttributeName 'durch Swift4.1 erhalten, aber ich ersetze' NSForegroundColorAttributeName 'durch' NSAttributedStringKey.foregroundColor 'und baue korrekt.
kj13
1
@ kj13 Danke für die Benachrichtigung, ich habe die Antwort aktualisiert und ein paar weitere Stile hinzugefügt
anoop4real
25

Bitte schön

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:lblTemp.text];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
lblTemp.attributedText = string;
Hardik Mamtora
quelle
20

Swift 4

// An attributed string extension to achieve colors on text.
extension NSMutableAttributedString {

    func setColor(color: UIColor, forText stringValue: String) {
       let range: NSRange = self.mutableString.range(of: stringValue, options: .caseInsensitive)
       self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

// Try it with label
let label = UILabel()
label.frame = CGRect(x: 70, y: 100, width: 260, height: 30)
let stringValue = "There are 5 results."
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColor(color: UIColor.red, forText: "5")
label.font = UIFont.systemFont(ofSize: 26)
label.attributedText = attributedString
self.view.addSubview(label)

Ergebnis

Geben Sie hier die Bildbeschreibung ein


Swift 3

func setColoredLabel() {
        var string: NSMutableAttributedString = NSMutableAttributedString(string: "redgreenblue")
        string.setColor(color: UIColor.redColor(), forText: "red")
        string.setColor(color: UIColor.greenColor(), forText: "green")
        string.setColor(color: UIColor.blueColor(, forText: "blue")
        mylabel.attributedText = string
    }


func setColor(color: UIColor, forText stringValue: String) {
        var range: NSRange = self.mutableString.rangeOfString(stringValue, options: NSCaseInsensitiveSearch)
        if range != nil {
            self.addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        }
    }

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Krunal
quelle
12
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";
NSString *myString = @"Not a member?signin";

//Create mutable string from original one
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:myString];

//Fing range of the string you want to change colour
//If you need to change colour in more that one place just repeat it
NSRange range = [myString rangeOfString:@"signin"];
[attString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:(63/255.0) green:(163/255.0) blue:(158/255.0) alpha:1.0] range:range];

//Add it to the label - notice its not text property but it's attributeText
_label.attributedText = attString;
Raju Dontiboina
quelle
6

Seit iOS 6 unterstützt UIKit das Zeichnen von zugewiesenen Zeichenfolgen, sodass keine Erweiterung oder Ersetzung erforderlich ist.

Von UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

Sie müssen nur Ihre aufbauen NSAttributedString. Grundsätzlich gibt es zwei Möglichkeiten:

  1. Fügen Sie Textblöcke mit denselben Attributen hinzu - erstellen Sie für jeden Teil eine NSAttributedStringInstanz und hängen Sie sie an eine anNSMutableAttributedString

  2. Erstellen Sie einen zugeordneten Text aus einer einfachen Zeichenfolge und fügen Sie dann einen zugewiesenen Text für bestimmte Bereiche hinzu. Suchen Sie den Bereich Ihrer Nummer (oder was auch immer) und wenden Sie darauf ein anderes Farbattribut an.

Tricertops
quelle
6

Anups antworten schnell. Kann aus jeder Klasse wiederverwendet werden.

In schneller Datei

extension NSMutableAttributedString {

    func setColorForStr(textToFind: String, color: UIColor) {

        let range = self.mutableString.rangeOfString(textToFind, options:NSStringCompareOptions.CaseInsensitiveSearch);
        if range.location != NSNotFound {
            self.addAttribute(NSForegroundColorAttributeName, value: color, range: range);
        }

    }
}

In einigen Ansicht Controller

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.labelShopInYourNetwork.text!);
attributedString.setColorForStr("YOUR NETWORK", color: UIColor(red: 0.039, green: 0.020, blue: 0.490, alpha: 1.0));
self.labelShopInYourNetwork.attributedText = attributedString;
Deepak Thakur
quelle
4

Ein UIWebView oder mehr als ein UILabel kann für diese Situation als übertrieben angesehen werden.

Mein Vorschlag wäre, TTTAttributedLabel zu verwenden , ein Drop-In-Ersatz für UILabel, das NSAttributedString unterstützt . Dies bedeutet, dass Sie sehr einfach unterschiedliche Stile auf verschiedene Bereiche in einer Zeichenfolge anwenden können.

Mic Pringle
quelle
3

NSAttributedStringist der Weg zu gehen. Die folgende Frage hat eine großartige Antwort, die Ihnen zeigt, wie es geht. Wie verwenden Sie NSAttributedString?

werner
quelle
3

Mit JTAttributedLabel (von mystcolor) können Sie die Unterstützung für zugewiesene Zeichenfolgen in UILabel unter iOS 6 und gleichzeitig die JTAttributedLabel-Klasse unter iOS 5 über JTAutoLabel verwenden.

Johan Kool
quelle
2

Es gibt eine Swift 3.0-Lösung

extension UILabel{


    func setSubTextColor(pSubString : String, pColor : UIColor){
        let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!);
        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString

    }
}

Und es gibt ein Beispiel für einen Anruf:

let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)
Kevin ABRIOUX
quelle
Hallo, wie mache ich das, wenn ich zwei verschiedene colorStrings hinzufügen möchte? Ich habe versucht, Ihr Beispiel zu verwenden und nur ein weiteres hinzuzufügen, aber es färbt immer noch nur eines von ihnen.
Erik Auranaune
Versuchen Sie Folgendes: let colorString = "(Zeichenfolge in Rot)" let colorStringGreen = "(Zeichenfolge in Grün)" self.mLabel.text = "klassische Farbe" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: UIColor .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
Kevin ABRIOUX
Das ist seltsam, es ändert immer noch nicht beides: s24.postimg.org/ds0rpyyut/… .
Erik Auranaune
Ein Problem ist, dass, wenn die beiden Zeichenfolgen gleich sind, nur eine davon gefärbt wird. Schauen Sie hier: pastebin.com/FJZJTpp3 . Sie haben auch eine Lösung für dieses Problem?
Erik Auranaune
2

Swift 4 und höher: Inspiriert von der Lösung von anoop4real , finden Sie hier eine String-Erweiterung, mit der Sie Text mit zwei verschiedenen Farben generieren können.

extension String {

    func attributedStringForPartiallyColoredText(_ textToFind: String, with color: UIColor) -> NSMutableAttributedString {
        let mutableAttributedstring = NSMutableAttributedString(string: self)
        let range = mutableAttributedstring.mutableString.range(of: textToFind, options: .caseInsensitive)
        if range.location != NSNotFound {
            mutableAttributedstring.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
        }
        return mutableAttributedstring
    }
}

Im folgenden Beispiel wird die Farbe des Sterns in Rot geändert, während die ursprüngliche Etikettenfarbe für den verbleibenden Text beibehalten wird.

label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))
Einzelgänger
quelle
2

Meine Antwort hat auch die Option, das gesamte Vorkommen eines Textes zu färben, nicht nur ein Vorkommen davon: "wa ba wa ba dubdub", Sie können das gesamte Vorkommen von wa nicht nur das erste Vorkommen wie die akzeptierte Antwort einfärben.

extension NSMutableAttributedString{
    func setColorForText(_ textToFind: String, with color: UIColor) {
        let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
        if range.location != NSNotFound {
            addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        }
    }

    func setColorForAllOccuranceOfText(_ textToFind: String, with color: UIColor) {
        let inputLength = self.string.count
        let searchLength = textToFind.count
        var range = NSRange(location: 0, length: self.length)

        while (range.location != NSNotFound) {
            range = (self.string as NSString).range(of: textToFind, options: [], range: range)
            if (range.location != NSNotFound) {
                self.addAttribute(NSForegroundColorAttributeName, value: color, range: NSRange(location: range.location, length: searchLength))
                range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length))
            }
        }
    }
}

Jetzt können Sie dies tun:

let message = NSMutableAttributedString(string: "wa ba wa ba dubdub")
message.setColorForText(subtitle, with: UIColor.red) 
// or the below one if you want all the occurrence to be colored 
message.setColorForAllOccuranceOfText("wa", with: UIColor.red) 
// then you set this attributed string to your label :
lblMessage.attributedText = message
Alsh Compiler
quelle
Und wie kann ich es benutzen?
Pableiros
1
Aktualisiert meine Antwort, einen schönen Tag :)
Alsh Compiler
1

Für Xamarin- Benutzer habe ich eine statische C # -Methode, bei der ich ein Array von Zeichenfolgen, ein Array von UIColours und ein Array von UIFonts übergebe (deren Länge übereinstimmen muss). Die zugewiesene Zeichenfolge wird dann zurückgegeben.

sehen:

public static NSMutableAttributedString GetFormattedText(string[] texts, UIColor[] colors, UIFont[] fonts)
    {

        NSMutableAttributedString attrString = new NSMutableAttributedString(string.Join("", texts));
        int position = 0;

        for (int i = 0; i < texts.Length; i++)
        {
            attrString.AddAttribute(new NSString("NSForegroundColorAttributeName"), colors[i], new NSRange(position, texts[i].Length));

            var fontAttribute = new UIStringAttributes
            {
                Font = fonts[i]
            };

            attrString.AddAttributes(fontAttribute, new NSRange(position, texts[i].Length));

            position += texts[i].Length;
        }

        return attrString;

    }
Craig Champion
quelle
1

In meinem Fall verwende ich Xcode 10.1. Es gibt eine Option zum Umschalten zwischen einfachem Text und zugeschriebenem Text im Beschriftungstext im Interface Builder

Geben Sie hier die Bildbeschreibung ein

Hoffe das kann jemand anderem helfen ..!

BharathRao
quelle
2
Es sieht so aus, als hätte XCode 11.0 den Attributed Text Editor beschädigt. Also habe ich versucht, TextEdit zum Erstellen des Textes zu verwenden, ihn dann in Xcode eingefügt und es hat überraschend gut funktioniert.
Brainware
0
extension UILabel{

    func setSubTextColor(pSubString : String, pColor : UIColor){


        let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);


        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString

    }
}
Dipak Panchasara
quelle
0

Meine eigene Lösung wurde mit einer Methode wie der nächsten erstellt:

-(void)setColorForText:(NSString*) textToFind originalText:(NSString *)originalString withColor:(UIColor*)color andLabel:(UILabel *)label{

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:originalString];
NSRange range = [originalString rangeOfString:textToFind];

[attString addAttribute:NSForegroundColorAttributeName value:color range:range];

label.attributedText = attString;

if (range.location != NSNotFound) {
    [attString addAttribute:NSForegroundColorAttributeName value:color range:range];
}
label.attributedText = attString; }

Es hat mit nur einer anderen Farbe im selben Text funktioniert, aber Sie können es problemlos an mehrere Farben im selben Satz anpassen.

Shontauro
quelle
0

Mit dem folgenden Code können Sie mehrere Farben basierend auf dem Wort festlegen.

NSMutableArray * array = [[NSMutableArray alloc] initWithObjects:@"1 ball",@"2 ball",@"3 ball",@"4 ball", nil];    
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] init];
for (NSString * str in array)
 {
    NSMutableAttributedString * textstr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ,",str] attributes:@{NSForegroundColorAttributeName :[self getRandomColor]}];
     [attStr appendAttributedString:textstr];
  }
UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 300, 300, 30)];
lab.attributedText = attStr;
[self.view addSubview:lab];

-(UIColor *) getRandomColor
{
   CGFloat redcolor = arc4random() % 255 / 255.0;
   CGFloat greencolor = arc4random() % 255 / 255.0;
   CGFloat bluencolor = arc4random() % 255 / 255.0;
   return  [UIColor colorWithRed:redcolor green:greencolor blue:bluencolor alpha:1.0];
}
Hari c
quelle
0

SwiftRichStringfunktioniert perfekt! Sie können +zwei zugeordnete Zeichenfolgen verketten

fujianjin6471
quelle