UILabel с текстом двух разных цветов - PullRequest
102 голосов
/ 28 июня 2011

Я хочу отобразить такую ​​строку в UILabel:

Есть 5 результатов.

Где число 5 красного цвета, а остальная часть строки черная.

Как я могу сделать это в коде?

Ответы [ 18 ]

219 голосов
/ 02 марта 2013

Способ сделать это - использовать NSAttributedString так:

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

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

Я создал расширение UILabel , чтобы сделать это .

57 голосов
/ 30 сентября 2015

Я сделал это, создав category для NSMutableAttributedString

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

Используйте это как

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

* 1014 ИСПОЛЬЗОВАНИЕ *

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 Спасибо за уведомление

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

Я провел больше экспериментов с атрибутами, и ниже приведены результаты, вот ИСТОЧНИК

Вот результат

Styles

25 голосов
/ 24 апреля 2015

Вот, пожалуйста,

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;
14 голосов
/ 04 марта 2017

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)

Результат

enter image description here


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

Результат:

enter image description here

12 голосов
/ 16 марта 2016
//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 голосов
/ 25 февраля 2016

Ответы на вопросы быстро.Может быть повторно использован из любого класса.

В файле swift

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

    }
}

В контроллере Some View

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;
6 голосов
/ 02 марта 2013

Поскольку iOS 6 , UIKit поддерживает отрисовку атрибутных строк, поэтому расширение или замена не требуется.

С UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

Вам просто нужно создать свой NSAttributedString. Есть два основных способа:

  1. Добавление фрагментов текста с одинаковыми атрибутами - для каждой части создайте один экземпляр NSAttributedString и добавьте их к одному NSMutableAttributedString

  2. Создайте атрибутивный текст из простой строки, а затем добавьте атрибутированный для заданных диапазонов - найдите диапазон вашего номера (или чего-либо еще) и примените к нему другой цветовой атрибут.

4 голосов
/ 28 июня 2011

Наличие UIWebView или нескольких UILabel может считаться излишним для этой ситуации.

Я бы предложил использовать TTTAttributedLabel , который представляет собой замену UILabel, поддерживающую NSAttributedString . Это означает, что вы можете очень легко применять разные стили к различным диапазонам в строке.

4 голосов
/ 28 июня 2011

Для отображения короткого отформатированного текста, который не нужно редактировать, Базовый текст - путь. Существует несколько проектов с открытым исходным кодом для меток, которые используют NSAttributedString и Core Text для рендеринга. См. Например CoreTextAttributedLabel или OHAttributedLabel .

3 голосов
/ 28 марта 2013

JTAttributedLabel (by mystcolor) позволяет использовать поддержку атрибутивных строк в UILabel под iOS 6 и одновременно с его классом JTAttributedLabel под iOS 5 через JTAutoLabel.

...