更改暗模式时未更新 HTML 字符串中的颜色

时间:2020-12-27 12:19:00

标签: ios swiftui

我正在使用 SwiftUI,带有用于在文本中显示 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 放颜色,但没有任何改变。

所有其他颜色都已更新,但此组件的唯一解决方案是终止并重新启动应用程序以使其成为正确的颜色。

我错过了什么吗?

1 个答案:

答案 0 :(得分: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.systemBackgroundUIColor.label,像这样的明/暗模式 - colorScheme == .dark ? Color.black : Color.white。为此,您还需要以这种方式在结构中声明 colorScheme - @Environment(\.colorScheme) var colorScheme