用NSAttributedString更改string的颜色?

我有一个调查滑块,根据滑块的值显示下列string:“非常糟糕,坏,好,很好,很好”。

这里是滑块的代码:

- (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来完成这项工作。

没有必要使用NSAttributedString 。 所有你需要的是一个简单的标签与正确的textColor 。 此外,这个简单的解决scheme将适用于所有版本的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; 

使用这样的东西(不检查编译器)

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

对于Swift 3:

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

请享用。

对于Swift 4:

 var attributes = [NSAttributedStringKey: AnyObject]() attributes[NSAttributedStringKey.foregroundColor] = UIColor.red let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes) label.attributedText = attributedString 

对于Swift 3:

 var attributes = [String: AnyObject]() attributes[NSForegroundColorAttributeName] = UIColor.red let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes) label.attributedText = attributedString 

使用Swift 4, NSAttributedStringKey有一个名为foregroundColor的静态属性。 foregroundColor具有以下声明:

 static let foregroundColor: NSAttributedStringKey 

这个属性的值是一个UIColor对象。 使用此属性可在渲染过程中指定文本的颜色。 如果您不指定此属性,则文本呈现为黑色。

以下Playground代码显示如何使用foregroundColor设置NSAttributedString实例的文本颜色:

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

下面的代码显示了一个可能的依赖NSAttributedString UIViewController实现,以便从NSAttributedString更新UILabel的文本和文本颜色:

 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 ,而只需要依赖UILabeltexttextColor属性。 因此,您可以使用以下代码replaceupdateDisplay()实现:

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