NSAttributedString के साथ स्ट्रिंग रंग बदलें?


147

मेरे पास एक सर्वे के लिए एक स्लाइडर है जो स्लाइडर के मूल्य के आधार पर निम्नलिखित स्ट्रिंग्स प्रदर्शित करता है: "वेरी बैड, बैड, ओके, गुड, वेरी गुड"।

यहाँ स्लाइडर के लिए कोड है:

- (IBAction) sliderValueChanged:(UISlider *)sender {
    scanLabel.text = [NSString stringWithFormat:@" %.f", [sender value]];
    NSArray *texts=[NSArray arrayWithObjects:@"Very Bad", @"Bad", @"Okay", @"Good", @"Very Good", @"Very Good", nil];
    NSInteger sliderValue=[sender value]; //make the slider value in given range integer one.
    self.scanLabel.text=[texts objectAtIndex:sliderValue];
}

मैं चाहता हूं कि "वेरी बैड" रेड हो, "बैड" ऑरेंज हो, "ओके" येलो हो, "गुड" और "वेरी गुड" ग्रीन हो।

मुझे समझ में नहीं आ रहा है कि यह कैसे NSAttributedStringकिया जाए।



आप एक UISlider मतलब है? यह एक लेबल नहीं है। तो मूल रूप से एक फ़ॉन्ट रंग के साथ एक UILabel के बारे में है? या क्या आप पाठ के एक हिस्से को रंगीन करना चाहते हैं?
रोजर


इस लाइब्रेरी का उपयोग करें, यह बहुत ही सरल है। github.com/iOSTechHub/AttributedString
आशीष चौहान

जवाबों:


196

उपयोग करने की कोई आवश्यकता नहीं है NSAttributedString। आप सभी की आवश्यकता के साथ एक सरल लेबल है textColor। प्लस यह सरल समाधान iOS के सभी संस्करणों के साथ काम करेगा, न कि केवल iOS 6।

लेकिन अगर आप उपयोग करने की इच्छा रखते हैं NSAttributedString, तो आप ऐसा कुछ कर सकते हैं:

UIColor *color = [UIColor redColor]; // select needed color
NSString *string = ... // the string to colorize
NSDictionary *attrs = @{ NSForegroundColorAttributeName : color };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:string attributes:attrs];
self.scanLabel.attributedText = attrStr;

4
मुझे नीचे के सभी मत समझ में नहीं आए। मेरा जवाब एक जिम्मेदार स्ट्रिंग का उपयोग करने की तुलना में बहुत सरल है। ओपी को NSAttributedStringइस कार्य के लिए उपयोग करने की कोई आवश्यकता नहीं है । यह एक बात होगी यदि लेबल के पाठ में कई विशेषताओं की आवश्यकता होती है, लेकिन यह नहीं है। पूरे लेबल को एक बार में एक रंग होना चाहिए।
रामादेवी

@ RubénE.Marín लेकिन यही समस्या है। ओपी ने गलती से सोचा कि समाधान का उपयोग करना आवश्यक है NSAttributedString। तो उन्होंने यही पूछा। असली सवाल "लेबल के रंग को उसके मूल्य के आधार पर कैसे निर्धारित किया जाए " होना चाहिए था । मैंने कहा कि समाधान की आवश्यकता नहीं है NSAttributedStringऔर बहुत सरल उत्तर दिखाया। और ओपी मेरे बहुत सरल उत्तर को स्वीकार करके सहमत हो गया। यदि ओपी वास्तव में चाहता था NSAttributedString, तो उन्होंने मेरे उत्तर को स्वीकार नहीं किया। इसलिए डाउन वोट का कोई कारण नहीं है। मैंने सच्चे सवाल का जवाब दिया और ओपी ने स्वीकार कर लिया।
राम

24
उस स्थिति में, मैंने NSAttributedString के साथ प्रश्न हल किया होगा और उसके बाद, मैंने ओपी के विशेष मामले के लिए आपके सरल और अधिक कुशल समाधान को इंगित किया होगा। इस सवाल पर आने वाले लोग आपके समाधान से निराश हो सकते हैं क्योंकि वे NSAttributedString पर पाठ का रंग बदलने के तरीकों की तलाश कर रहे हैं (और यह आपके नीचे के वोटों की व्याख्या करेगा)।
रूबेन मारिन

15
Ruben is right: मैं यहां इसलिए आया क्योंकि मुझे रंग को एक जिम्मेदार स्ट्रिंग में सेट करने की आवश्यकता है, क्योंकि मैं कई रंगों और फ़ॉन्ट आकारों के साथ मिश्रित परिसर का निर्माण कर रहा हूं। और मुझे जो जानकारी चाहिए थी उसका मुख्य टुकड़ा वह NSForegroundColorAttributeNameकुंजी थी, जो मुझे ऐप्पल डॉक्स में खोजने में कठिन समय था।
एरिक वैन डेर नीट

5
सवाल का जवाब देने के लिए धन्यवाद !! भले ही ओपी को वास्तव में इसकी आवश्यकता नहीं थी। इसलिए कई बार मैं कुछ गूगल करता हूं, एक स्टैक ओवरफ्लो प्रश्न पर समाप्त होता है, जो वास्तव में मैं देख रहा हूं, केवल यह खोजने के लिए कि प्रश्न का उत्तर देने वाले बुद्धिमान-गधे ने निर्णय लिया कि ओपी को वास्तव में क्या प्रश्न शीर्षक की आवश्यकता नहीं थी और एक बिल्कुल अलग सवाल का जवाब दिया। खैर, भविष्य में लोग खोज परिणामों से आ रहे हैं, जिनमें से 1 ओपी के विपरीत 1000 हो सकते हैं, जो वास्तव में पोस्ट के शीर्षक में पूछे गए प्रश्न का हल चाहते हैं। </ rant>
danny

112

इस तरह से कुछ का उपयोग करें (संकलक जाँच नहीं)

NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:self.text.text];
NSRange range=[self.myLabel.text rangeOfString:texts[sliderValue]]; //myLabel is the outlet from where you will get the text, it can be same or different

NSArray *colors=@[[UIColor redColor],
                  [UIColor redColor],
                  [UIColor yellowColor],
                  [UIColor greenColor]
                 ];

[string addAttribute:NSForegroundColorAttributeName 
               value:colors[sliderValue] 
               range:range];           

[self.scanLabel setAttributedText:texts[sliderValue]];

अरे अनूप, तुम्हें फिर से देखकर खुशी हुई! मैंने आपके द्वारा प्रदान किए गए कोड को मिटा दिया, मैंने self.sxtLabel.text के साथ self.text.text को बदल दिया, लेकिन मुझे "शब्द" में त्रुटि मिल रही है। मैंने @ "वेरी बैड" को बिना किसी भाग्य के साथ बदलने की कोशिश की।
एडम

मैंने अपना जवाब यहां से stackoverflow.com/questions/14231879/…
अनूप वैद्य

धन्यवाद अनूप, लेकिन मेरे लिए कोई भाग्य नहीं। - [__ NSCFString _ui_synthesizeAttributedSubstringFromRange: usingDefaultAttributes:]: unrecognized selector को उदाहरण के लिए 0x1f8aafaf03 2013-01-11 16: 27: 34.939 yellaProto [7829: 907] पर ऐप को समाप्त करने के लिए एप्लिकेशन को समाप्त करने की वजह से ऐप को समाप्त करना है। _ui_synthesizeAttributedSubstringFromRange: usingDefaultAttributes:]: गैर मान्यता प्राप्त चयनकर्ता 'उदाहरण 0x1f845af0 के लिए भेजा
एडम

बस कोशिश करो कि ओटू को "ग्रंथों" का पता लगाने के लिए
मॉर्कॉम

@ मॉर्कॉम: यदि आप इस उत्तर में 2 टिप्पणियाँ देखते हैं, तो आपको पता चल जाएगा: p
अनूप वैद्य

48

में स्विफ्ट 4 :

// Custom color
let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1)
// create the attributed colour
let attributedStringColor = [NSAttributedStringKey.foregroundColor : greenColor];
// create the attributed string
let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor)
// Set the label
label.attributedText = attributedString

में स्विफ्ट 3 :

// Custom color
let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1)
// create the attributed color
let attributedStringColor : NSDictionary = [NSForegroundColorAttributeName : greenColor];
// create the attributed string
let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor as? [String : AnyObject])
// Set the label
label.attributedText = attributedString 

का आनंद लें।


28

के लिए स्विफ्ट 5:

var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

के लिए स्विफ्ट 4:

var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

के लिए स्विफ्ट 3:

var attributes = [String: AnyObject]()
attributes[NSForegroundColorAttributeName] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

7

आप बना सकते हैं NSAttributedString

NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor redColor] };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"My Color String" attributes:attrs];

या रंग के NSMutableAttributedStringसाथ कस्टम विशेषताओं को लागू करने के लिए।

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@%@", methodPrefix, method] attributes: @{ NSFontAttributeName : FONT_MYRIADPRO(48) }];
[attributedString addAttribute:NSFontAttributeName value:FONT_MYRIADPRO_SEMIBOLD(48) range:NSMakeRange(methodPrefix.length, method.length)];

उपलब्ध विशेषताएँ: NSAttributedStringKey


अपडेट करें:

स्विफ्ट 5.1

let message: String = greeting + someMessage
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2.0
    
// Note: UIFont(appFontFamily:ofSize:) is extended init.
let regularAttributes: [NSAttributedString.Key : Any] = [.font : UIFont(appFontFamily: .regular, ofSize: 15)!, .paragraphStyle : paragraphStyle]
let boldAttributes = [NSAttributedString.Key.font : UIFont(appFontFamily: .semiBold, ofSize: 15)!]

let mutableString = NSMutableAttributedString(string: message, attributes: regularAttributes)
mutableString.addAttributes(boldAttributes, range: NSMakeRange(0, greeting.count))

5

स्विफ्ट 4 के साथ, NSAttributedStringKeyएक स्थिर संपत्ति कहा जाता है foregroundColorforegroundColorनिम्नलिखित घोषणा है:

static let foregroundColor: NSAttributedStringKey

इस विशेषता का मान एक UIColorवस्तु है। रेंडरिंग के दौरान टेक्स्ट के रंग को निर्दिष्ट करने के लिए इस विशेषता का उपयोग करें। यदि आप इस विशेषता को निर्दिष्ट नहीं करते हैं, तो पाठ काले रंग में प्रस्तुत किया गया है।

निम्नलिखित खेल का मैदान कोड दिखाता है कि किस तरह से एक NSAttributedStringउदाहरण के पाठ का रंग निर्धारित किया जाता है foregroundColor:

import UIKit

let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)

नीचे दिया गया कोड एक संभावित UIViewControllerकार्यान्वयन दिखाता है जो एक NSAttributedStringसे पाठ और पाठ के रंग को अद्यतन करने के लिए पर निर्भर करता UILabelहै UISlider:

import UIKit

enum Status: Int {
    case veryBad = 0, bad, okay, good, veryGood

    var display: (text: String, color: UIColor) {
        switch self {
        case .veryBad:  return ("Very bad", .red)
        case .bad:      return ("Bad", .orange)
        case .okay:     return ("Okay", .yellow)
        case .good:     return ("Good", .green)
        case .veryGood: return ("Very good", .blue)
        }
    }

    static let minimumValue = Status.veryBad.rawValue
    static let maximumValue = Status.veryGood.rawValue
}
final class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var slider: UISlider!
    var currentStatus: Status = Status.veryBad {
        didSet {
            // currentStatus is our model. Observe its changes to update our display
            updateDisplay()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Prepare slider
        slider.minimumValue = Float(Status.minimumValue)
        slider.maximumValue = Float(Status.maximumValue)

        // Set display
        updateDisplay()
    }

    func updateDisplay() {
        let attributes = [NSAttributedStringKey.foregroundColor : currentStatus.display.color]
        let attributedString = NSAttributedString(string: currentStatus.display.text, attributes: attributes)
        label.attributedText = attributedString
        slider.value = Float(currentStatus.rawValue)
    }

    @IBAction func updateCurrentStatus(_ sender: UISlider) {
        let value = Int(sender.value.rounded())
        guard let status = Status(rawValue: value) else { fatalError("Could not get Status object from value") }
        currentStatus = status
    }

}

ध्यान दें कि आपको वास्तव में NSAttributedStringइस तरह के उदाहरण के लिए उपयोग करने की आवश्यकता नहीं है और बस UILabel's textऔर textColorगुणों पर भरोसा कर सकते हैं। इसलिए, आप अपने updateDisplay()कार्यान्वयन को निम्न कोड से बदल सकते हैं :

func updateDisplay() {
    label.text = currentStatus.display.text
    label.textColor = currentStatus.display.color
    slider.value = Float(currentStatus.rawValue)
}

2

स्विफ्ट 4.2 के लिए अपडेट

var attributes = [NSAttributedString.Key: AnyObject]()

attributes[.foregroundColor] = UIColor.blue

let attributedString = NSAttributedString(string: "Very Bad",
attributes: attributes)

label.attributedText = attributedString

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