首页 文章

使用NSAttributedString更改字符串颜色?

提问于
浏览
120

我有一个调查滑块,根据滑块的值显示以下字符串:“非常糟糕,糟糕,好,好,非常好” .

以下是滑块的代码:

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

6 回答

  • 19

    对于 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
    
  • 3

    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
    

    请享用 .

  • 167

    无需使用 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;
    
  • 111

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

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

    你可以创建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

  • 4

    使用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)
    

    下面的代码显示了一个可能的 UIViewController 实现,该实现依赖于 NSAttributedString ,以便从 UISlider 更新 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 属性 . 因此,您可以使用以下代码替换 updateDisplay() 实现:

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

相关问题