如何通过界面生成器在属性字符串中使用动态颜色?

How to use dynamic colors in attributed strings via interface builder?

根据Implementing Dark Mode on iOS,我们需要将 foregroundColor 属性设置为新的标签颜色。这是如何使用界面生成器完成的?

我尝试使用 "Text Color" 选项并将颜色设置为 Developer->labelColor,但这没有用。

编辑:由于目前这是不可能的,我使用了这个解决方法:

override func viewDidLoad() {
    // Support Dark Mode
    if #available(iOS 13.0, *) {
        let attributes = NSMutableAttributedString(attributedString: textView.attributedText!)
        attributes.addAttribute(.foregroundColor, value: UIColor.label, range: NSRange(location: 0, length: attributes.mutableString.length))
        textView.attributedText = attributes
    }
}

您不能在 Interface Builder 中执行此操作。您必须在代码中设置 .foregroundColor 属性。

let mas = NSMutableAttributedString(string:s, attributes:[
    .font:UIFont(name:"GillSans", size:15)!,
    .foregroundColor:UIColor.label,
]

不确定属性,但我可以最轻松地将属性文本的颜色设置为支持深色模式的颜色之一:

textView.textColor = UIColor.label
static let textColor = UIColor { traitCollection in
    if traitCollection.userInterfaceStyle == .dark {
        return .white
    } else {
        return .black
    }
}

let attributedText: [NSAttributedString.Key: Any] = [
        .font: font,
        .foregroundColor: UIColor.textColor
    ]

我找到了一个简单的解决方法:如果您将 UILabel 更改为“纯文本”,您可以指定暗模式支持的颜色,如“标签颜色”,然后您可以将文本更改为“属性”。现在它正在使用 Attributed Text 属性,但它仍然使用您之前指定的颜色。如果您不手动更改颜色,它将保持这种颜色。您仍然可以更改字体大小和粗细。

编辑:我注意到有时当您在 IB 中更改字体大小时,Xcode 会为您更改颜色……完全破坏了深色模式的自动颜色更改。您可以放弃这些更改: