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:NSForegroundColorAttributeNamevalue: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;}
func setColoredLabel(){letstring=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?iflet 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
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
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";NSString*myString =@"Not a member?signin";//Create mutable string from original oneNSMutableAttributedString*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 itNSRange range =[myString rangeOfString:@"signin"];[attString addAttribute:NSForegroundColorAttributeNamevalue:[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;
Sie müssen nur Ihre aufbauen NSAttributedString. Grundsätzlich gibt es zwei Möglichkeiten:
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
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.
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.
Für die Anzeige von kurzem, formatiertem Text, der nicht bearbeitet werden muss, ist Core Text der richtige Weg. Es gibt mehrere Open-Source-Projekte für Labels, die NSAttributedStringCore Text zum Rendern verwenden. Siehe beispielsweise CoreTextAttributedLabel oder OHAttributedLabel .
NSAttributedStringist der Weg zu gehen. Die folgende Frage hat eine großartige Antwort, die Ihnen zeigt, wie es geht. Wie verwenden Sie NSAttributedString?
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.
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)
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.
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.stringasNSString).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
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:
publicstaticNSMutableAttributedStringGetFormattedText(string[] texts,UIColor[] colors,UIFont[] fonts){NSMutableAttributedString attrString =newNSMutableAttributedString(string.Join("", texts));int position =0;for(int i =0; i < texts.Length; i++){
attrString.AddAttribute(newNSString("NSForegroundColorAttributeName"), colors[i],newNSRange(position, texts[i].Length));var fontAttribute =newUIStringAttributes{Font= fonts[i]};
attrString.AddAttributes(fontAttribute,newNSRange(position, texts[i].Length));
position += texts[i].Length;}return attrString;}
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
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.
Antworten:
Der Weg, dies zu tun, ist
NSAttributedString
wie folgt zu verwenden :Ich habe dafür eine
UILabel
Erweiterung erstellt .quelle
Ich habe dies getan, indem ich ein
category
für erstellt habeNSMutableAttributedString
Verwenden Sie es wie
SWIFT 3
VERWENDUNG
SWIFT 4 @ kj13 Vielen Dank für Ihre Benachrichtigung
Ich habe mehr Experimente mit Attributen durchgeführt und unten sind die Ergebnisse, hier ist der SOURCECODE
Hier ist das Ergebnis
quelle
Bitte schön
quelle
Swift 4
Ergebnis
Swift 3
Ergebnis:
quelle
quelle
Seit iOS 6 unterstützt UIKit das Zeichnen von zugewiesenen Zeichenfolgen, sodass keine Erweiterung oder Ersetzung erforderlich ist.
Von
UILabel
:Sie müssen nur Ihre aufbauen
NSAttributedString
. Grundsätzlich gibt es zwei Möglichkeiten:Fügen Sie Textblöcke mit denselben Attributen hinzu - erstellen Sie für jeden Teil eine
NSAttributedString
Instanz und hängen Sie sie an eine anNSMutableAttributedString
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.
quelle
Anups antworten schnell. Kann aus jeder Klasse wiederverwendet werden.
In schneller Datei
In einigen Ansicht Controller
quelle
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.
quelle
Für die Anzeige von kurzem, formatiertem Text, der nicht bearbeitet werden muss, ist Core Text der richtige Weg. Es gibt mehrere Open-Source-Projekte für Labels, die
NSAttributedString
Core Text zum Rendern verwenden. Siehe beispielsweise CoreTextAttributedLabel oder OHAttributedLabel .quelle
NSAttributedString
ist der Weg zu gehen. Die folgende Frage hat eine großartige Antwort, die Ihnen zeigt, wie es geht. Wie verwenden Sie NSAttributedString?quelle
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.
quelle
Es gibt eine Swift 3.0-Lösung
Und es gibt ein Beispiel für einen Anruf:
quelle
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.
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.
quelle
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.
Jetzt können Sie dies tun:
quelle
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:
quelle
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
Hoffe das kann jemand anderem helfen ..!
quelle
quelle
Meine eigene Lösung wurde mit einer Methode wie der nächsten erstellt:
Es hat mit nur einer anderen Farbe im selben Text funktioniert, aber Sie können es problemlos an mehrere Farben im selben Satz anpassen.
quelle
Mit dem folgenden Code können Sie mehrere Farben basierend auf dem Wort festlegen.
quelle
SwiftRichString
funktioniert perfekt! Sie können+
zwei zugeordnete Zeichenfolgen verkettenquelle