Với Swift 4, NSAttributedStringKeycó một thuộc tính tĩnh được gọi foregroundColor. foregroundColorcó tuyên bố sau:
static let foregroundColor: NSAttributedStringKey
Giá trị của thuộc tính này là một UIColorđối tượng. Sử dụng thuộc tính này để chỉ định màu của văn bản trong khi kết xuất. Nếu bạn không chỉ định thuộc tính này, văn bản được hiển thị màu đen.
Mã Playground sau đây cho biết cách đặt màu văn bản của một NSAttributedStringthể hiện với foregroundColor:
import UIKit
let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)
Mã dưới đây cho thấy một UIViewControllertriển khai có thể dựa vào NSAttributedStringđể cập nhật văn bản và màu văn bản của một UILabeltừ 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
}
}
Tuy nhiên, lưu ý rằng bạn không thực sự cần sử dụng NSAttributedStringcho một ví dụ như vậy và chỉ có thể dựa vào UILabelcác thuộc tính textvà textColor. Do đó, bạn có thể thay thế updateDisplay()triển khai của mình bằng mã sau:
func updateDisplay() {
label.text = currentStatus.display.text
label.textColor = currentStatus.display.color
slider.value = Float(currentStatus.rawValue)
}