W Swift 4 NSAttributedStringKey
ma statyczną właściwość o nazwie foregroundColor
. foregroundColor
posiada następującą deklarację:
static let foregroundColor: NSAttributedStringKey
Wartością tego atrybutu jest UIColor
obiekt. Użyj tego atrybutu, aby określić kolor tekstu podczas renderowania. Jeśli nie określisz tego atrybutu, tekst będzie wyświetlany na czarno.
Poniższy kod Playground pokazuje, jak ustawić kolor tekstu NSAttributedString
wystąpienia za pomocą foregroundColor
:
import UIKit
let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)
Poniższy kod przedstawia możliwą UIViewController
implementację, która polega na NSAttributedString
aktualizacji tekstu i koloru tekstu a UILabel
z 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
}
}
Należy jednak pamiętać, że tak naprawdę nie trzeba używać NSAttributedString
takiego przykładu, a może po prostu polegać na UILabel
„s text
i textColor
właściwości. Dlatego możesz zastąpić swoją updateDisplay()
implementację następującym kodem:
func updateDisplay() {
label.text = currentStatus.display.text
label.textColor = currentStatus.display.color
slider.value = Float(currentStatus.rawValue)
}