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?
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?
Antworten:
Der Weg, dies zu tun, ist NSAttributedString
wie 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 .
Ich habe dies getan, indem ich ein category
fü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
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;
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
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:
//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;
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:
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.
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;
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 NSAttributedString
Core Text zum Rendern verwenden. Siehe beispielsweise CoreTextAttributedLabel oder OHAttributedLabel .
NSAttributedString
ist 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.
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)
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))
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
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;
}
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 ..!
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
}
}
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.
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];
}
SwiftRichString
funktioniert perfekt! Sie können +
zwei zugeordnete Zeichenfolgen verketten