Nhãn với văn bản có hai màu khác nhau


109

Tôi muốn hiển thị một chuỗi như thế này trong UILabel:

Có 5 kết quả.

Trong đó số 5 có màu đỏ và phần còn lại của dây màu đen.

Làm thế nào tôi có thể làm điều này trong mã?


6
@EmptyStack Đây chắc chắn không phải là trường hợp vì iOS 4 hỗ trợ NSAttributedString. Xem câu trả lời của tôi dưới đây.
Mic Pringle

Câu trả lời:


223

Cách làm là sử dụng NSAttributedStringnhư sau:

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

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

Tôi đã tạo một UILabel tiện ích mở rộng để làm việc đó .


Tôi có thể thêm mục tiêu vào nó. Thnaks
UserDev

Tôi vừa thêm tiện ích mở rộng của bạn vào dự án của tôi! Cám ơn!
Zeb

Danh mục Tốt đẹp cho UILabel. Cảm ơn rất nhiều. Đây phải là câu trả lời được chấp nhận.
Pradeep Reddy Kypa

63

Tôi đã làm điều này bằng cách tạo ra một categorychoNSMutableAttributedString

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

Sử dụng nó như

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

SỬ DỤNG

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 Cảm ơn bạn đã thông báo

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

Tôi đã thực hiện nhiều thử nghiệm hơn với các thuộc tính và dưới đây là kết quả, đây là SOURCECODE

Đây là kết quả

Phong cách


2
Bạn cần phải tạo ra một loại mới cho NSMutableAttributedString với phương pháp ... anyways tôi đã thêm mẫu này để github, bạn có thể lấy và kiểm tra xem nó github.com/anoop4real/NSMutableAttributedString-Color
anoop4real

Nhưng tôi cần phải đặt màu của tất cả bảng chữ cái với tính không nhạy cảm trong một chuỗi .... giống như tất cả "e" trong màu đỏ của toàn bộ chuỗi
Ravi Ojha

Không có @interface hiển thị cho 'NSMutableAttributedString' khai báo bộ chọn 'setColorForText: withColor:'
ekashking

1
Tôi gặp lỗi 'Sử dụng mã nhận dạng chưa được giải quyết' NSForegroundColorAttributeName 'bằng Swift4.1, nhưng tôi thay thế' NSForegroundColorAttributeName 'thành' NSAttributedStringKey.foregroundColor 'và xây dựng chính xác.
kj13

1
@ kj13 Cảm ơn bạn đã thông báo, tôi đã cập nhật câu trả lời và thêm một vài phong cách khác
anoop4real,

25

Của bạn đây

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;

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)

Kết quả

nhập mô tả hình ảnh ở đây


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

Kết quả:

nhập mô tả hình ảnh ở đây


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;

6

Kể từ iOS 6 , UIKit hỗ trợ vẽ các chuỗi phân bổ, vì vậy không cần phần mở rộng hoặc thay thế.

Từ UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

Bạn chỉ cần xây dựng của bạn NSAttributedString. Về cơ bản có hai cách:

  1. Nối các đoạn văn bản có cùng thuộc tính - đối với mỗi phần, hãy tạo một NSAttributedStringphiên bản và nối chúng vào mộtNSMutableAttributedString

  2. Tạo văn bản được phân bổ từ chuỗi thuần túy và sau đó thêm phân bổ cho các phạm vi nhất định - tìm phạm vi số của bạn (hoặc bất kỳ thứ gì) và áp dụng thuộc tính màu khác nhau trên đó.


6

Anups trả lời nhanh chóng. Có thể được sử dụng lại từ bất kỳ lớp nào.

Trong tệp nhanh chóng

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

    }
}

Trong một số chế độ xem bộ điều khiển

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;

4

Có một UIWebView hoặc nhiều UILabel có thể được coi là quá mức cần thiết cho tình huống này.

Đề xuất của tôi là sử dụng TTTAttributedLabel , đây là phần mềm thay thế cho UILabel hỗ trợ NSAttributedString . Điều này có nghĩa là bạn có thể rất dễ dàng áp dụng các kiểu khác nhau cho các phạm vi khác nhau trong một chuỗi.




3

JTAttributedLabel (bởi mystcolor) cho phép bạn sử dụng hỗ trợ chuỗi phân bổ trong UILabel trong iOS 6 và đồng thời lớp JTAttributedLabel trong iOS 5 thông qua JTAutoLabel của nó.


2

Có một giải pháp 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

    }
}

Và có một ví dụ về cuộc gọi:

let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)

Xin chào, làm cách nào để thực hiện việc này nếu tôi muốn thêm hai Chuỗi màu khác nhau? Tôi đã cố gắng sử dụng ví dụ của bạn và chỉ cần thêm một số khác, nhưng nó vẫn chỉ màu sắc một trong số họ ..
Erik Auranaune

Hãy thử cách này: let colorString = "(string in red)" 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

Điều này thật kỳ lạ, nó vẫn không thay đổi cả hai: s24.postimg.org/ds0rpyyut/… .
Erik Auranaune

Một vấn đề là nếu hai chuỗi giống nhau, nó chỉ tô màu cho một trong số chúng, hãy xem tại đây: pastebin.com/FJZJTpp3 . Bạn có một sửa chữa cho điều này là tốt?
Erik Auranaune

2

Swift 4 trở lên: Lấy cảm hứng từ giải pháp của anoop4real , đây là phần mở rộng Chuỗi có thể được sử dụng để tạo văn bản với 2 màu khác nhau.

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

Ví dụ sau thay đổi màu của dấu hoa thị thành màu đỏ trong khi vẫn giữ nguyên màu nhãn gốc cho văn bản còn lại.

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

2

Câu trả lời của tôi cũng có tùy chọn tô màu cho tất cả sự xuất hiện của một văn bản không chỉ một lần xuất hiện của nó: "wa ba wa ba dubdub", bạn có thể tô màu tất cả sự xuất hiện của wa không chỉ sự xuất hiện đầu tiên như câu trả lời được chấp nhận.

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

Bây giờ bạn có thể làm điều này:

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

Và tôi có thể sử dụng nó như thế nào?
pableiros

1
Cập nhật câu trả lời của tôi, có một ngày tốt lành :)
Alsh biên dịch

1

Đối với người dùng Xamarin, tôi có một phương thức C # tĩnh trong đó tôi truyền vào một mảng chuỗi, một mảng UIColours và mảng UIFonts (chúng sẽ cần phải khớp về độ dài). Chuỗi phân bổ sau đó sẽ được trả lại.

xem:

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;

    }

1

Trong trường hợp của tôi, tôi đang sử dụng Xcode 10.1. Có một tùy chọn chuyển đổi giữa văn bản thuần túy và văn bản thuộc tính trong văn bản Nhãn trong Trình tạo giao diện

nhập mô tả hình ảnh ở đây

Hy vọng điều này có thể giúp ai đó khác ..!


2
Có vẻ như XCode 11.0 đã phá vỡ trình chỉnh sửa Văn bản thuộc tính. Vì vậy, tôi đã thử sử dụng TextEdit để tạo văn bản sau đó dán nó vào Xcode và nó hoạt động tốt một cách đáng ngạc nhiên.
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

    }
}

0

Giải pháp của riêng tôi đã được tạo ra một phương pháp giống như phương pháp tiếp theo:

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

Nó hoạt động chỉ với một màu khác nhau trong cùng một văn bản nhưng bạn có thể dễ dàng điều chỉnh nó thành nhiều màu hơn trong cùng một câu.


0

Bằng cách sử dụng mã bên dưới, bạn có thể đặt nhiều màu dựa trên từ.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.