ios 使用 NSAttributedString 更改字符串颜色?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14287386/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Change string color with NSAttributedString?
提问by Adam
I have a slider for a survey that display the following strings based on the value of the slider: "Very Bad, Bad, Okay, Good, Very Good".
我有一个用于调查的滑块,它根据滑块的值显示以下字符串:“非常差、差、好的、好、非常好”。
Here is the code for the slider:
这是滑块的代码:
- (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];
}
I want "Very Bad" to be red, "Bad" to be orange, "Okay" to be yellow, "Good" and "Very Good" to be green.
我希望“非常差”为红色,“差”为橙色,“好的”为黄色,“好”和“非常好”为绿色。
I don't understand how to use NSAttributedString
to get this done.
我不明白如何使用NSAttributedString
来完成这项工作。
回答by rmaddy
There is no need for using NSAttributedString
. All you need is a simple label with the proper textColor
. Plus this simple solution will work with all versions of iOS, not just iOS 6.
没有必要使用NSAttributedString
. 您所需要的只是一个带有正确textColor
. 此外,这个简单的解决方案适用于所有版本的 iOS,而不仅仅是 iOS 6。
But if you needlessly wish to use NSAttributedString
, you can do something like this:
但是,如果您不必要地希望使用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;
回答by Anoop Vaidya
Use something like this (Not compiler checked)
使用这样的东西(未检查编译器)
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]];
回答by App Dev Guy
In Swift 4:
在Swift 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
In Swift 3:
在Swift 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
Enjoy.
享受。
回答by pableiros
For Swift 5:
对于Swift 5:
var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = UIColor.red
let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)
label.attributedText = attributedString
For Swift 4:
对于Swift 4:
var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.foregroundColor] = UIColor.red
let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)
label.attributedText = attributedString
For Swift 3:
对于Swift 3:
var attributes = [String: AnyObject]()
attributes[NSForegroundColorAttributeName] = UIColor.red
let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)
label.attributedText = attributedString
回答by Lal Krishna
You can create NSAttributedString
你可以创建 NSAttributedString
NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor redColor] };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"My Color String" attributes:attrs];
OR NSMutableAttributedString
to apply custom attributes with Ranges.
或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)];
Available Attributes: NSAttributedStringKey
UPDATE:
更新:
Swift 5.1
斯威夫特 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))
回答by Imanou Petit
With Swift 4, NSAttributedStringKey
has a static property called foregroundColor
. foregroundColor
has the following declaration:
在 Swift 4 中,NSAttributedStringKey
有一个名为foregroundColor
. foregroundColor
有以下声明:
static let foregroundColor: NSAttributedStringKey
The value of this attribute is a
UIColor
object. Use this attribute to specify the color of the text during rendering. If you do not specify this attribute, the text is rendered in black.
该属性的值是一个
UIColor
对象。使用此属性指定渲染期间文本的颜色。如果未指定此属性,则文本呈现为黑色。
The following Playground code shows how to set the text color of an NSAttributedString
instance with foregroundColor
:
以下 Playground 代码显示了如何使用 设置NSAttributedString
实例的文本颜色foregroundColor
:
import UIKit
let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)
The code below shows a possible UIViewController
implementation that relies on NSAttributedString
in order to update the text and text color of a UILabel
from a UISlider
:
下面的代码显示了一个可能的UIViewController
实现,它依赖于从 aNSAttributedString
更新 a 的文本和文本颜色: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
}
}
Note however that you don't really need to use NSAttributedString
for such an example and can simply rely on UILabel
's text
and textColor
properties. Therefore, you can replace your updateDisplay()
implementation with the following code:
但是请注意,NSAttributedString
对于这样的示例,您实际上并不需要使用它,而可以简单地依赖UILabel
'stext
和textColor
属性。因此,您可以updateDisplay()
使用以下代码替换您的实现:
func updateDisplay() {
label.text = currentStatus.display.text
label.textColor = currentStatus.display.color
slider.value = Float(currentStatus.rawValue)
}
回答by Mithra Singam
Update for Swift 4.2
Swift 4.2 更新
var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = UIColor.blue
let attributedString = NSAttributedString(string: "Very Bad",
attributes: attributes)
label.attributedText = attributedString
回答by Fedotchenco Denis
One liner for Swift:
Swift 的一种衬垫:
NSAttributedString(string: "Red Text", attributes: [.foregroundColor: UIColor.red])