更改暗模式时未更新 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.systemBackgroundUIColor.label,例如colorScheme == .dark ? Color.black : Color.white。为此,您还需要以这种方式在您的结构中声明 colorScheme - @Environment(\.colorScheme) var colorScheme

【讨论】:

以上是关于更改暗模式时未更新 HTML 字符串中的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)

在flutter中进入暗模式时更改系统导航和状态栏的颜色

iOS 13 中的暗模式启动屏幕

为什么在明暗模式下通知颜色不同?

如何更改状态栏颜色?

SFSafariViewController 没有带有自定义条形颜色的暗模式