用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
,而只需要依赖UILabel
的text
和textColor
属性。 因此,您可以使用以下代码replaceupdateDisplay()
实现:
func updateDisplay() { label.text = currentStatus.display.text label.textColor = currentStatus.display.color slider.value = Float(currentStatus.rawValue) }