এনএসএট্রিবিউটেড স্ট্রিং দিয়ে স্ট্রিংয়ের রঙ পরিবর্তন করবেন?


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



তুমি কি ইউআইএস্লাইডার বলতে চাও? এটির একটি লেবেল নেই। সুতরাং মূলত এটির কোনও ফন্টের রঙের সাথে একটি ইউআইএলবেল? বা আপনি কি রঙিন পাঠ্যের একটি অংশ চান?
রজার


এই লাইব্রেরিটি ব্যবহার করুন, এটি খুবই সাধারণ। github.com/iOSTechHub/AtributesString
আশীষ চৌহান

উত্তর:


196

ব্যবহার করার দরকার নেই NSAttributedString। আপনার যা দরকার তা হ'ল যথাযথ সহ একটি সাধারণ লেবেলtextColor । প্লাস এই সহজ সমাধানটি আইওএস 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এই কাজের জন্য ওপি ব্যবহার করার দরকার নেই । লেবেলের পাঠ্যে একাধিক বৈশিষ্ট্যের প্রয়োজন থাকলে এটি এক জিনিস হবে it পুরো লেবেলটি একবারে এক রঙের হওয়া দরকার।
rmaddy

@ রুবনেই.মারান তবে সমস্যাটি। ওপি ভুল করে ভেবেছিল যে সমাধানটি ব্যবহারের প্রয়োজন NSAttributedString। সুতরাং তারা এটাই চেয়েছিল। আসল প্রশ্নটি "লেবেলের রঙের মানটির ভিত্তিতে কীভাবে সেট করা যায়" হওয়া উচিত ছিল । আমি নির্দেশ করেছিলাম যে সমাধানটির NSAttributedStringখুব বেশি সহজ উত্তর প্রয়োজন হয় না এবং দেখায়। এবং ওপি আমার অনেক সহজ উত্তর স্বীকার করে সম্মত হয়েছিল। ওপি যদি সত্যিই চাইত তবে NSAttributedStringতারা আমার উত্তর গ্রহণ করত না। সুতরাং ডাউন ভোটের কোনও কারণ নেই। আমি সত্য প্রশ্নের উত্তর দিয়েছি এবং ওপি গ্রহণ করেছে।
rmaddy

24
সেক্ষেত্রে আমি এনএসএট্রিবিউটেড স্ট্রিং দিয়ে প্রশ্নটি সমাধান করে দিতাম, তারপরে আমি ওপি-র নির্দিষ্ট ক্ষেত্রে আপনার সহজ এবং আরও কার্যকর সমাধানটি নির্দেশ করতাম। এই প্রশ্নে আসা লোকেরা আপনার সমাধান দেখে হতাশ হতে পারে কারণ তারা এনএসএট্রিবিউটেড স্ট্রিংয়ে পাঠ্য রঙ পরিবর্তন করার উপায়গুলি খুঁজছেন (এবং এটি আপনার নিচের ভোটের ব্যাখ্যা দেবে)।
রুবেন মেরিন

15
রুবান ঠিক বলেছেন: আমি এখানে এসেছি কারণ আমার একটি বিশিষ্ট স্ট্রিংয়ে রঙ সেট করার দরকার নেই কারণ আমি একাধিক রঙ এবং ফন্টের আকারের সাথে একটি যৌগিক বিশিষ্ট স্ট্রিং তৈরি করছি। এবং আমার যে কী তথ্যটির দরকার ছিল তা হ'ল NSForegroundColorAttributeNameচাবিকাঠি, যা অ্যাপল ডক্সে খুঁজে পেতে আমার খুব কষ্ট হয়েছিল।
এরিক ভ্যান ডের নিউট 13'15

5
এখনও প্রশ্নের উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ !! এমনকি যদি ওপিকে আসলে এটির প্রয়োজন না হত। অনেকবার আমি কিছু গুগল করলাম, স্ট্যাকের ওভারফ্লো প্রশ্নটি শেষ করছি যা আমি ঠিক যা খুঁজছি, কেবল এটিই খুঁজে পেতে যে প্রশ্নের উত্তর দেওয়া বুদ্ধিমান গাধা সিদ্ধান্ত নিয়েছে যে ওপি আসলে প্রশ্নের শিরোনাম যা চেয়েছিল তা দরকার নেই এবং একটি সম্পূর্ণ ভিন্ন প্রশ্নের উত্তর। ঠিক আছে, ভবিষ্যতে লোকেরা অনুসন্ধানের ফলাফলগুলি থেকে আসছে, যার মধ্যে 1 টির তুলনায় 1000 এর বিপরীতে থাকতে পারে, পোস্টের শিরোনামে জিজ্ঞাসিত প্রশ্নের সমাধান সম্ভবত পেতে পারে। </ran>
ড্যানি

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.text.text এর সাথে self.scanLabel.text প্রতিস্থাপন করেছি, তবে "শব্দ" এ আমি একটি ত্রুটি পাচ্ছি। আমি এটির পরিবর্তে @ "খুব খারাপ" দিয়ে প্রতিস্থাপন করার চেষ্টা করেছি।
আদম

আমি আমার উত্তরটি এখানে থেকে অনুলিপি করেছি stackoverflow.com/questions/14231879/…
অনুপ বৈদ্য

অনুপকে ধন্যবাদ, তবে আমার পক্ষে ভাগ্য নেই। - [__ NSCFString _ui_synthesizeAtributesSubstringFromRange: ডিফল্টঅ্যাট্রিবিউটস ব্যবহার করে:]: অজ্ঞাত নির্বাচক নির্বাচিত উদাহরণ 0x1f845af0 2013-01-11 16: 27: 34.939 ইয়েলপ্রোটো [7829: 907] *** 'অব্যাহত কারণে অবসন্ন' - _উই_সাইটিসাইজ অ্যাট্রিবিউটেড সাবস্ট্রিংফ্রান্সরেঞ্জ: ডিফল্ট অ্যাট্রিবিউটস ব্যবহার করে:]: অবিখ্যাত সিলেক্টর 0x1f845af0 '
আদম

ওটুকে কী "পাঠ্য" তা বোঝার চেষ্টা করুন
মোরক্রোম

@ মোরক্রোম: যদি আপনি এই উত্তরে ২ য় মন্তব্য দেখতে পান, তবে আপনি জানতে পারবেন: পি
অনুপ বৈদ্য

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

উপলভ্য বৈশিষ্ট্য: এনএসএট্রিবিউটেড স্ট্রিংকি


হালনাগাদ:

সুইফট 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একটি টেক্সট এবং টেক্সট রঙ আপডেট করতে অনুক্রমে UILabelA থেকে 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এর 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.