İki farklı renkte metin içeren UILabel


109

Bunun gibi bir dizeyi a UILabel:

5 sonuç var.

5 sayısının kırmızı renkte olduğu ve dizenin geri kalanının siyah olduğu yerde.

Bunu kodla nasıl yapabilirim?


6
@EmptyStack iOS 4, NSAttributedString'i desteklediği için durum kesinlikle böyle değildir . Aşağıdaki cevabıma bakın.
Mic Pringle

Yanıtlar:


223

Bunu yapmanın yolu şu şekilde kullanmaktır NSAttributedString:

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

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

Bunu UILabel yapmak için bir uzantı oluşturdum .


Üzerine hedefler ekleyebilir miyim? Thnaks
UserDev

Uzantınızı az önce projeme ekledim! Teşekkürler!
Zeb

UILabel için Güzel Kategori. Çok teşekkürler. Kabul edilen cevap bu olmalıdır.
Pradeep Reddy Kypa

63

Bunu bir categoryfor oluşturarak yaptımNSMutableAttributedString

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

Gibi kullan

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

KULLANIM

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 Bildirim için teşekkürler

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

Özniteliklerle daha fazla deney yaptım ve sonuçlar aşağıdadır, işte SOURCECODE

İşte sonuç

stiller


2
Yöntemle NSMutableAttributedString için yeni bir Kategori oluşturmalısınız ... her neyse, bu örneği github'a
ekledim

Ama tüm alfabenin rengini bir dizede duyarsız olacak şekilde ayarlamam gerekiyor .... tüm dizenin kırmızı rengindeki tüm "e" gibi
Ravi Ojha

'NSMutableAttributedString' için görünür bir @ arabirim yok 'setColorForText: withColor:' seçicisini bildiriyor
ekashking

1
Swift4.1 ile 'Çözümlenmemiş' NSForegroundColorAttributeName tanımlayıcısının kullanılması 'hatasını aldım, ancak' NSForegroundColorAttributeName'i 'NSAttributedStringKey.foregroundColor' olarak değiştiriyorum ve doğru şekilde oluşturuyorum.
kj13

1
@ kj13 Bildirim için teşekkürler, cevabı güncelledim ve birkaç stil daha ekledim
anoop4real

25

Hadi bakalım

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)

Sonuç

görüntü açıklamasını buraya girin


Hızlı 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)
        }
    }

Sonuç:

görüntü açıklamasını buraya girin


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

İOS 6'dan beriİOS UIKit, çizimle ilişkilendirilmiş dizeleri desteklediğinden, herhangi bir uzatma veya değiştirme gerekmez.

Kimden UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

Sadece kendi NSAttributedString. Temel olarak iki yol vardır:

  1. Aynı niteliklere sahip metin parçaları ekleyin - her bölüm için bir NSAttributedStringörnek oluşturun ve bunları bir örneğe ekleyinNSMutableAttributedString

  2. Düz dizeden ilişkilendirilmiş metin oluşturun ve ardından belirli aralıklar için ilişkilendirilmiş metin ekleyin - numaranızın aralığını (veya her neyse) bulun ve buna farklı renk özelliği uygulayın.


6

Anups hızla cevap verir. Herhangi bir sınıftan yeniden kullanılabilir.

Hızlı dosyada

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

    }
}

Bazı görünüm denetleyicisinde

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

Bir UIWebView veya birden fazla UILabel'e sahip olmak, bu durum için gereğinden fazla kabul edilebilir.

Benim önerim kullanmak olacaktır TTTAttributedLabel bir açılan yerine UILabel için destekler olduğunu NSAttributedString . Bu, bir dizedeki farklı aralıklara farklı stilleri kolayca uygulayabileceğiniz anlamına gelir.




3

JTAttributedLabel ( mystcolor tarafından), iOS 6 altında UILabel'de atfedilen dize desteğini ve aynı zamanda JTAutoLabel aracılığıyla iOS 5 altındaki JTAttributedLabel sınıfını kullanmanıza izin verir.


2

Swift 3.0 çözümü var

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

    }
}

Ve bir çağrı örneği var:

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

Merhaba, iki farklı colorStrings eklemek istersem bunu nasıl yaparım?
Örneğinizi

Bunu deneyin: let colorString = "(kırmızı dize)" let colorStringGreen = "(yeşil dize)" self.mLabel.text = "klasik renk" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: UIColor .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
Kevin ABRIOUX

Bu tuhaf, yine de ikisini birden değiştirmiyor: s24.postimg.org/ds0rpyyut/… .
Erik Auranaune

Sorun şu ki, iki dizge aynıysa, yalnızca birini renklendiriyor, buraya bakın: pastebin.com/FJZJTpp3 . Bunun için de bir düzeltmen var mı?
Erik Auranaune

2

Swift 4 ve üstü: anoop4real'ın çözümünden esinlenerek , işte 2 farklı renkte metin oluşturmak için kullanılabilecek bir String uzantısı.

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

Aşağıdaki örnek, kalan metin için orijinal etiket rengini korurken yıldız işaretinin rengini kırmızıya dönüştürür.

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

2

Cevabım ayrıca bir metnin tüm oluşumunu renklendirme seçeneğine de sahiptir: "wa ba wa ba dubdub", wa'nın tüm oluşumunu sadece kabul edilen cevap gibi ilk kez değil, renklendirebilirsiniz.

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

Şimdi bunu yapabilirsiniz:

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

Ve nasıl kullanabilirim?
pableiros

1
Cevabımı güncelledi, iyi günler :)
Alsh derleyicisi

1

İçin Xamarin kullanıcıları bir statik var C # bir dizi dizeyi, UIColours dizisini ve UIFonts dizisini (uzunluk olarak eşleşmeleri gerekecek) geçirdiğim yöntemim var. İlişkilendirilen dize daha sonra geri aktarılır.

görmek:

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

Benim durumumda Xcode 10.1 kullanıyorum. Arayüz Oluşturucu'da Etiket metninde düz metin ile İlişkilendirilmiş metin arasında geçiş yapma seçeneği vardır.

görüntü açıklamasını buraya girin

Umarım bu başka birine yardımcı olabilir ..!


2
Görünüşe göre XCode 11.0, Attributed Text editörünü bozmuş. Bu yüzden, metni oluşturmak için TextEdit'i kullanmayı denedim, ardından Xcode'a yapıştırdım ve şaşırtıcı derecede iyi çalıştı.
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

Kendi çözümüm, bir sonraki gibi bir yöntem yarattı:

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

Aynı metinde yalnızca bir farklı renkle çalıştı, ancak aynı cümle içinde daha fazla renge kolayca uyarlayabilirsiniz.


0

Aşağıdaki kodu kullanarak kelimeye göre birden fazla renk ayarlayabilirsiniz.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.