使用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
Ashish Chauhan

Answers:


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
我不明白所有的否决票。我的答案比使用属性字符串要简单得多。OP无需NSAttributedString用于此任务。如果标签的文本需要多个属性,但是不需要多个属性,那将是一回事。整个标签一次只能是一种颜色。
rmaddy 2015年

@RubénE.Marín但这就是问题所在。OP误认为需要使用解决方案NSAttributedString。这就是他们要求的。真正的问题应该是“如何根据标签的颜色设置标签的颜色”。我指出该解决方案不是必需的,NSAttributedString并且给出了一个简单得多的答案。OP接受了我简单得多的答案,表示同意。如果OP 确实想要NSAttributedString,他们将不会接受我的回答。因此,没有理由投反对票。我回答了真实的问题,OP被接受了。
rmaddy 2015年

24
在那种情况下,我将使用NSAttributedString解决该问题,然后,我将针对特定的OP情况指出您更简单,更有效的解决方案。遇到这个问题的人可能会对您的解决方案感到沮丧,因为他们正在寻找改变NSAttributedString上文本颜色的方法(这将解释您的反对意见)。
鲁本·马林

15
鲁本是对的:我来这里是因为我确实需要在属性字符串中设置颜色,因为我正在构建具有多种颜色和字体大小的复合属性字符串。我需要的NSForegroundColorAttributeName关键信息就是密钥,我在Apple文档中很难找到它。
Erik van der Neut

5
感谢您仍然回答问题!!即使OP实际上并不需要它。如此多次,我用谷歌搜索某个东西,最终遇到了一个堆栈溢出问题,而这正是我在寻找的东西,却发现明智的回答该问题的人决定了OP实际上并不需要问题标题所要求的,回答了一个完全不同的问题。好吧,未来的人可能来自搜索结果,而搜索结果中可能有1000个而不是1个OP,实际上可能想要解决帖子标题中提出的问题。</ rant>
丹尼2015年

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

嘿Anoop,很高兴再次见到您!我整理了您提供的代码,将self.text.text替换为self.scanLabel.text,但是“ word”出现错误。我尝试用@“ Very Bad”代替它,但没有运气。
亚当

我复制从这里我的答案stackoverflow.com/questions/14231879/...
Anoop维迪

感谢Anoop,但是对我来说没有运气。-[__ NSCFString _ui_synthesizeAttributedSubstringFromRange:usingDefaultAttributes:]:无法识别的选择器已发送至实例0x1f845af0 2013-01-11 16:27:34.939 yellaProto [7829:907] ***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__ NSCFString _ui_synthesizeAttributedSubstringFromRange:usingDefaultAttributes:]:无法识别的选择器已发送给实例0x1f845af0'–
Adam

只是想弄清楚是什么“文本”
Morkrom 2013年

@Morkrom:如果您在此答案中看到第二条评论,那么您将了解:p
Anoop Vaidya,2013年

48

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

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 

请享用。


28

对于Swift 5:

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

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

label.attributedText = attributedString

对于Swift 4:

var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.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

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

在Swift 4中,NSAttributedStringKey静态属性称为foregroundColorforegroundColor具有以下声明:

static let foregroundColor: NSAttributedStringKey

此属性的值是一个UIColor对象。使用此属性可以指定渲染期间文本的颜色。如果未指定此属性,则文本将显示为黑色。

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

import UIKit

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

下面的代码显示了一种可能的UIViewController实现,该实现依赖于从a NSAttributedString来更新a的文本和文本颜色:UILabelUISlider

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属性即可。因此,可以用updateDisplay()以下代码替换实现:

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

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 using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.