更改暗模式时未更新 HTML 字符串中的颜色
Posted
技术标签:
【中文标题】更改暗模式时未更新 HTML 字符串中的颜色【英文标题】:Color in HTML string not updated when changing dark mode 【发布时间】:2020-12-27 12:19:00 【问题描述】:我正在使用 SwiftUI,带有用于在 Text 中显示 html 文本的自定义视图:
struct HTMLText: UIViewRepresentable
private let html: String
private let label = UILabel()
init(html: String, font: String? = nil, size: CGFloat? = nil)
self.html = html
func makeUIView(context: UIViewRepresentableContext<Self>) -> UILabel
DispatchQueue.main.async
let data = Data(html.utf8)
if let attributedString = try? NSAttributedString(
data: data,
options: [.documentType: NSAttributedString.DocumentType.html],
documentAttributes:nil)
label.attributedText = attributedString
return label
func updateUIView(_ uiView: UILabel, context: Context)
在我的主要观点中,我就是这样使用它的:
struct ConsonantListItem: View
let consonant: Consonant
var color : String = "#\(UIColor(named: "DefaultText")?.getHexString() ?? "")"
var body: some View
VStack
HTMLText(html: "<div style=\"text-align:center\"><span style=\"font-size:20px;font-family:'Helvetica Neue';color:\(self.color)\">\(consonant.consonantRtgs)</span></div>")
.frame(height: 20)
// ...
如果我正在运行我的应用程序,它工作得很好,并且颜色是正确的,无论我处于浅色还是深色模式(DefaultText 是资产中的一种颜色,在浅色模式下为黑色,白色在黑暗模式下)。但是当我在设置中切换模式时,这个组件的颜色并没有更新。我之前尝试用@State 设置颜色,但没有任何改变。
所有其他颜色都已更新,但此组件的唯一解决方案是杀死并重新启动应用程序以使其成为正确的颜色。
我错过了什么吗?
【问题讨论】:
不清楚“颜色未更新”是什么意思。应该更新哪种颜色? 谢谢@Asperi 我更新了我的代码和描述。希望现在更清楚了 【参考方案1】:考虑不在 html 中而是通过 Swift 来管理颜色。此外,您可能必须在 updateUIView 中添加相同的代码才能触发更改。查看修改后的代码:
struct HTMLText: UIViewRepresentable
private let html: String
init(html: String, font: String? = nil, size: CGFloat? = nil)
self.html = html
func makeUIView(context: UIViewRepresentableContext<Self>) -> UILabel
let label = UILabel()
setLabelText(label: label)
return label
func updateUIView(_ uiView: UILabel, context: Context)
setLabelText(label: uiView)
private func setLabelText(label: UILabel)
DispatchQueue.main.async
let data = Data(html.utf8)
if let attributedString = try? NSAttributedString(
data: data,
options: [.documentType: NSAttributedString.DocumentType.html],
documentAttributes:nil)
label.attributedText = attributedString
label.backgroundColor = UIColor.systemBackground
label.textColor = UIColor.label
您可以使用自定义颜色来代替UIColor.systemBackground
和UIColor.label
,例如colorScheme == .dark ? Color.black : Color.white
。为此,您还需要以这种方式在您的结构中声明 colorScheme
- @Environment(\.colorScheme) var colorScheme
【讨论】:
以上是关于更改暗模式时未更新 HTML 字符串中的颜色的主要内容,如果未能解决你的问题,请参考以下文章