UILabel dengan teks dua warna berbeda

109

Saya ingin menampilkan string seperti ini di UILabel:

Ada 5 hasil.

Dimana angka 5 berwarna merah dan sisanya berwarna hitam.

Bagaimana saya bisa melakukan ini dalam kode?

Peter
sumber
6
@EmptyStack Hal ini tentunya tidak terjadi karena iOS 4 mendukung NSAttributedString. Lihat jawaban saya di bawah.
Mic Pringle

Jawaban:

223

Cara melakukannya adalah dengan menggunakan NSAttributedStringseperti ini:

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

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

Saya membuat UILabel ekstensi untuk melakukannya .

João Costa
sumber
Bisakah saya menambahkan target di atasnya. Thnaks
UserDev
Saya baru saja menambahkan ekstensi Anda ke proyek saya! Terima kasih!
Zeb
Kategori bagus untuk UILabel. Terima kasih banyak. Ini harus menjadi jawaban yang diterima.
Pradeep Reddy Kypa
63

Saya telah melakukan ini dengan membuat categoryuntukNSMutableAttributedString

-(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];
    }
}

Gunakan seperti itu

- (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)
        }
    }
}

PEMAKAIAN

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 Terima kasih telah memberi tahu

// 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!)
    }
}

Saya telah melakukan lebih banyak eksperimen dengan atribut dan di bawah ini adalah hasilnya, berikut adalah SOURCECODE

Inilah hasilnya

Gaya

anoop4real
sumber
2
Anda perlu membuat Kategori baru untuk NSMutableAttributedString dengan metode ... bagaimanapun saya menambahkan sampel ini ke github, Anda dapat mengambil dan memeriksanya github.com/anoop4real/NSMutableAttributedString-Color
anoop4real
Tetapi saya perlu mengatur warna semua alfabet dengan peka dalam string .... seperti semua "e" dalam warna merah dari seluruh string
Ravi Ojha
@Interface tidak terlihat untuk 'NSMutableAttributedString' mendeklarasikan selector 'setColorForText: withColor:'
ekashking
1
Saya mendapat kesalahan 'Use of unresolved identifier' NSForegroundColorAttributeName 'dengan Swift4.1, tetapi saya mengganti' NSForegroundColorAttributeName 'menjadi' NSAttributedStringKey.foregroundColor 'dan membangun dengan benar.
kj13
1
@ kj13 Terima kasih telah memberi tahu, saya memperbarui jawabannya dan menambahkan beberapa gaya lagi
anoop4real
25

Ini dia

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
sumber
20

Cepat 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)

Hasil

masukkan deskripsi gambar di sini


Cepat 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)
        }
    }

Hasil:

masukkan deskripsi gambar di sini

Krunal
sumber
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
sumber
6

Sejak iOS 6 , UIKit mendukung menggambar string yang diatribusikan, jadi tidak diperlukan ekstensi atau penggantian.

Dari UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

Anda hanya perlu membangun NSAttributedString. Pada dasarnya ada dua cara:

  1. Tambahkan potongan teks dengan atribut yang sama - untuk setiap bagian buat satu NSAttributedStringcontoh dan tambahkan ke satuNSMutableAttributedString

  2. Buat teks atribut dari string biasa dan kemudian tambahkan atribut untuk rentang tertentu - temukan rentang nomor Anda (atau apa pun) dan terapkan atribut warna berbeda pada itu.

Tricertops
sumber
6

Anups menjawab dengan cepat. Dapat digunakan kembali dari kelas mana pun.

Dalam file cepat

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);
        }

    }
}

Dalam Beberapa pengontrol tampilan

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
sumber
4

Memiliki UIWebView atau lebih dari satu UILabel dapat dianggap berlebihan untuk situasi ini.

Saran saya adalah menggunakan TTTAttributedLabel yang merupakan pengganti drop-in untuk UILabel yang mendukung NSAttributedString . Ini berarti Anda dapat dengan mudah menerapkan gaya yang berbeda ke rentang yang berbeda dalam sebuah string.

Mic Pringle
sumber
3

NSAttributedStringadalah cara untuk pergi. Pertanyaan berikut memiliki jawaban yang bagus yang menunjukkan kepada Anda bagaimana melakukannya Bagaimana Anda menggunakan NSAttributedString

werner
sumber
3

JTAttributedLabel (oleh mystcolor) memungkinkan Anda menggunakan dukungan string yang diatribusikan di UILabel di bawah iOS 6 dan pada saat yang sama kelas JTAttributedLabel di bawah iOS 5 melalui JTAutoLabel-nya.

Johan Kool
sumber
2

Ada solusi Swift 3.0

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

    }
}

Dan ada contoh panggilan:

let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)
Kevin ABRIOUX
sumber
Hai, bagaimana cara melakukannya jika saya ingin menambahkan dua colorString yang berbeda? Saya mencoba menggunakan contoh Anda dan menambahkan satu sama lain, tetapi itu masih hanya mewarnai salah satunya ..
Erik Auranaune
Coba ini: biarkan colorString = "(string berwarna merah)" let colorStringGreen = "(string in green)" self.mLabel.text = "classic color" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: UIColor .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
Kevin ABRIOUX
Ini aneh, masih tidak mengubah keduanya: s24.postimg.org/ds0rpyyut/… .
Erik Auranaune
Masalahnya adalah jika kedua string itu sama, hanya mewarnai salah satunya, lihat di sini: pastebin.com/FJZJTpp3 . Anda memiliki perbaikan untuk ini juga?
Erik Auranaune
2

Swift 4 ke atas: Terinspirasi oleh solusi anoop4real , berikut adalah ekstensi String yang dapat digunakan untuk menghasilkan teks dengan 2 warna berbeda.

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
    }
}

Contoh berikut mengubah warna tanda bintang menjadi merah sambil mempertahankan warna label asli untuk teks yang tersisa.

label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))
Maverick
sumber
2

Jawaban saya juga memiliki opsi untuk mewarnai semua kemunculan teks tidak hanya satu kemunculannya: "wa ba wa ba dubdub", Anda dapat mewarnai semua kemunculan wa tidak hanya kemunculan pertama seperti jawaban yang diterima.

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))
            }
        }
    }
}

Sekarang Anda bisa melakukan ini:

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
Kompiler alsh
sumber
Dan bagaimana saya bisa menggunakannya?
pableiros
1
Memperbarui jawaban saya, semoga harimu menyenangkan :)
Alsh compiler
1

Untuk pengguna Xamarin, saya memiliki metode C # statis di mana saya mengirimkan array string, array UIColours dan array UIFonts (panjangnya harus sama). String yang dikaitkan kemudian diteruskan kembali.

Lihat:

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
sumber
1

Dalam kasus saya, saya menggunakan Xcode 10.1. Ada opsi untuk beralih antara teks biasa dan teks Atribut dalam teks Label di Pembuat Antarmuka

masukkan deskripsi gambar di sini

Semoga ini dapat membantu orang lain ..!

BharathRao
sumber
2
Sepertinya XCode 11.0 merusak editor Teks Atribut. Jadi, saya mencoba menggunakan TextEdit untuk membuat teks lalu menempelkannya ke Xcode dan ternyata bekerja dengan sangat baik.
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
sumber
0

Solusi saya sendiri adalah membuat metode seperti berikut ini:

-(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; }

Ini berfungsi hanya dengan satu warna berbeda dalam teks yang sama tetapi Anda dapat menyesuaikannya dengan mudah ke lebih banyak warna dalam kalimat yang sama.

shontauro
sumber
0

Dengan menggunakan kode di bawah ini Anda dapat mengatur beberapa warna berdasarkan kata.

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
sumber
0

SwiftRichStringbekerja dengan sempurna! Anda dapat menggunakan +untuk menggabungkan dua string yang dikaitkan

fujianjin6471
sumber