दो अलग-अलग रंगों के पाठ के साथ UILabel


109

मैं इस तरह से एक स्ट्रिंग प्रदर्शित करना चाहता हूं UILabel:

5 परिणाम हैं।

जहां नंबर 5 का रंग लाल है और बाकी का हिस्सा काला है।

मैं इसे कोड में कैसे कर सकता हूं?


6
@EmptyStack iOS 4 NSAttributedString का समर्थन करता है क्योंकि यह निश्चित रूप से ऐसा नहीं है। नीचे मेरा जवाब देखें।
माइक प्रिंगल

जवाबों:


223

इसे करने का तरीका NSAttributedStringइस तरह है:

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

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

मैंने UILabel इसे करने के लिए एक एक्सटेंशन बनाया ।


क्या मैं इस पर लक्ष्य जोड़ सकता हूं। Thnaks
UserDev

मैंने अभी अपने प्रोजेक्ट में आपका एक्सटेंशन जोड़ा है! धन्यवाद!
Zeb

UILabel के लिए अच्छी श्रेणी। बहुत बहुत धन्यवाद। यह स्वीकृत उत्तर होना चाहिए।
प्रदीप रेड्डी कीपा

63

के 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;
}

स्विफ्ट 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)
        }
    }
}

उपयोग

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

मैंने विशेषताओं के साथ अधिक प्रयोग किए हैं और नीचे परिणाम हैं, यहां SOURCECODE है

यहाँ परिणाम है

शैलियाँ


2
आप विधि के साथ NSMutableAttributedString के लिए एक नई श्रेणी बनाने की आवश्यकता है ... वैसे भी मैं GitHub को यह नमूना कहा, आप हड़पने और यह जांच कर सकते हैं github.com/anoop4real/NSMutableAttributedString-Color
anoop4real

लेकिन मुझे एक स्ट्रिंग में अगोचर के साथ सभी वर्णमाला का रंग सेट करने की आवश्यकता है .... जैसे पूरे स्ट्रिंग के लाल रंग में सभी "ई"
रवि ओझा

'NSMutableAttributedString' के लिए कोई दिखाई @interface चयनकर्ता ': withColor setColorForText' वाणी
ekashking

1
मुझे Swift4.1 के साथ 'अप्रचलित पहचानकर्ता' NSForegroundColorAttributeName 'का उपयोग करने में त्रुटि हुई, लेकिन मैं' NSForegroundColorAttributeName 'को' NSAttributedStringKey .foregroundColor 'और सही ढंग से निर्माण करने की जगह लेता हूं।
kj13

1
@ kj13 सूचित करने के लिए धन्यवाद, मैंने उत्तर को अपडेट किया और कुछ और शैलियों को जोड़ा
अनूप ४४

25

हेयर यू गो

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

स्विफ्ट 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)

परिणाम

यहां छवि विवरण दर्ज करें


स्विफ्ट 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)
        }
    }

परिणाम:

यहां छवि विवरण दर्ज करें


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

IOS 6 के बाद से , UIKit आट्रिटेड स्ट्रिंग्स को खींचने का समर्थन करता है, इसलिए किसी एक्सटेंशन या प्रतिस्थापन की आवश्यकता नहीं है।

से UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

आपको बस अपना निर्माण करने की आवश्यकता है NSAttributedString। मूल रूप से दो तरीके हैं:

  1. एक ही विशेषता के साथ पाठ के अंशों को जोड़ें - प्रत्येक भाग के लिए एक NSAttributedStringउदाहरण बनाएं और उन्हें एक में जोड़ देंNSMutableAttributedString

  2. प्लेन स्ट्रिंग से एट्रिब्यूटेड टेक्स्ट बनाएं और फिर दिए गए रेंज के लिए एट्रिब्यूट जोड़ें - अपनी संख्या (या जो भी हो) की रेंज ढूंढें और उस पर अलग-अलग रंग विशेषता लागू करें।


6

अनूप्स ने तेजी से जवाब दिया। किसी भी वर्ग से पुन: उपयोग किया जा सकता है।

स्विफ्ट फ़ाइल में

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

    }
}

कुछ दृश्य नियंत्रक में

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

इस स्थिति के लिए UIWebView या एक से अधिक UILabel होने को ओवरकिल माना जा सकता है।

मेरा सुझाव TTTAttributedLabel का उपयोग करना होगा जो कि यूएबेल के लिए एक ड्रॉप-इन प्रतिस्थापन है जो NSAttributedString का समर्थन करता है । इसका मतलब है कि आप एक स्ट्रिंग में विभिन्न श्रेणियों के लिए बहुत आसानी से विभिन्न शैलियों को लागू कर सकते हैं।


4

लघु प्रदर्शित करने के लिए, स्वरूपित पाठ जिसे संपादन योग्य होने की आवश्यकता नहीं है, कोर पाठ जाने का मार्ग है। लेबल के लिए कई ओपन-सोर्स प्रोजेक्ट हैं जो NSAttributedStringरेंडरिंग के लिए कोर टेक्स्ट का इस्तेमाल करते हैं। उदाहरण के लिए CoreTextAttributedLabel या OHAttributedLabel देखें ।



3

JTAttributedLabel ( मिस्ट्रीकलर द्वारा) आपको आईओएस 6 के तहत यूआईबेल में जिम्मेदार स्ट्रिंग सपोर्ट का उपयोग करने की अनुमति देता है और साथ ही इसके जेटाटोलेबेल के माध्यम से आईओएस 5 के तहत इसका जेटीएटिवेनडेलैबेल वर्ग।


2

एक स्विफ्ट 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

    }
}

और कॉल का एक उदाहरण है:

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

नमस्ते, अगर मैं दो अलग-अलग कलरस्ट्रीम जोड़ना चाहता हूं तो मैं यह कैसे करूं? मैंने आपके उदाहरण का उपयोग करने की कोशिश की और बस एक और जोड़ दिया, लेकिन यह अभी भी उनमें से केवल एक को रंग देता है ..
एरिक औराना

इसे आज़माएं: colorString = "(लाल रंग में स्ट्रिंग)" let colorStringGreen = "(हरा रंग में स्ट्रिंग)" self.mLabel.text = "क्लासिक रंग" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: Uolor) .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
केविन एबीरिक्स

यह अजीब है, यह अभी भी दोनों को नहीं बदलता है: s24.postimg.org/ds0rpyyut/…
एरिक औराना

एक समस्या यह है कि यदि दो तार समान हैं, तो यह केवल उनमें से एक को रंग देता है, यहां देखें: pastebin.com/FJZJTpp3 । आप इस aswell के लिए एक तय है?
एरिक औराना

2

स्विफ्ट 4 और इसके बाद के संस्करण: अनूप 4 रियल के समाधान से प्रेरित , यहां एक स्ट्रिंग एक्सटेंशन है जिसका उपयोग 2 अलग-अलग रंगों के साथ पाठ उत्पन्न करने के लिए किया जा सकता है।

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

शेष पाठ के लिए मूल लेबल रंग को बनाए रखते हुए उदाहरण के बाद तारांकन का रंग लाल हो जाता है।

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

2

मेरे उत्तर में एक पाठ की सभी घटना को रंगने का विकल्प होता है, न केवल इसकी एक घटना होती है: "वा बा बा बा डबडब", आप वा की सभी घटना को रंग दे सकते हैं, केवल स्वीकृत उत्तर की तरह पहली घटना नहीं।

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

अब आप यह कर सकते हैं:

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

और मैं इसका उपयोग कैसे कर सकता हूं?
पाइबिरोस

1
मेरे उत्तर को अपडेट करें, आपका दिन शुभ हो :)
Alsh compiler

1

के लिए Xamarin उपयोगकर्ताओं मैं एक स्थिर है सी # तरीका है जहाँ मैं तार की एक सरणी में पारित, UIColours और UIFonts की सरणी की एक सरणी (वे लंबाई में मैच के लिए की आवश्यकता होगी)। इसके बाद आरोपित स्ट्रिंग को वापस पारित किया जाता है।

देख:

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

मेरे मामले में मैं Xcode 10.1 का उपयोग कर रहा हूं। इंटरफ़ेस बिल्डर में लेबल टेक्स्ट में सादे पाठ और विशेषता पाठ के बीच स्विच करने का एक विकल्प है

यहां छवि विवरण दर्ज करें

उम्मीद है कि यह किसी और की मदद कर सकता है ..!


2
ऐसा लग रहा है कि XCode 11.0 ने Attributed Text Editor को तोड़ दिया। इसलिए, मैंने टेक्स्ट बनाने के लिए TextEdit का उपयोग करने की कोशिश की और फिर इसे Xcode में पेस्ट किया और इसने आश्चर्यजनक रूप से अच्छा काम किया।
ब्रेनवेयर

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

मेरा अपना समाधान अगले एक की तरह एक विधि बनाया गया था:

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

यह एक ही पाठ में केवल एक अलग रंग के साथ काम करता है लेकिन आप इसे एक ही वाक्य में अधिक रंगों में आसानी से अनुकूलित कर सकते हैं।


0

नीचे दिए गए कोड का उपयोग करके आप शब्द के आधार पर कई रंग सेट कर सकते हैं।

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

0

SwiftRichStringसही काम करता है! आप +दो जिम्मेदार स्ट्रिंग को संक्षिप्त करने के लिए उपयोग कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.