SwiftUI:在滚动视图中显示HTML文本

SwiftUI:在滚动视图中显示HTML文本,swift,swiftui,nsattributedstring,geometryreader,Swift,Swiftui,Nsattributedstring,Geometryreader,我试图在我正在制作的应用程序中显示一些HTML文本,但我无法让它正常工作。 问题是,包含文本的视图总是以一行的高度显示,即使它被包装在滚动视图中。在屏幕截图中,你们可以看到ScrollView可以工作,但原始大小非常小 代码是: ScrollView { GeometryReader { proxy in AttributedText(htmlContent: job.description)

我试图在我正在制作的应用程序中显示一些HTML文本,但我无法让它正常工作。 问题是,包含文本的视图总是以一行的高度显示,即使它被包装在滚动视图中。在屏幕截图中,你们可以看到ScrollView可以工作,但原始大小非常小

代码是:

ScrollView {
                GeometryReader { proxy in
                    AttributedText(htmlContent: job.description)
                        .frame(height: proxy.size.height, alignment: .center)
                }
            }

struct AttributedText: UIViewRepresentable {
    let htmlContent: String
    
    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.loadHTMLString(htmlContent, baseURL: nil)
    }
}

struct AttributedText_Previews: PreviewProvider {
    static var previews: some View {
        AttributedText(htmlContent: "<h1>This is HTML String</h1>")
    }
}
滚动视图{
GeometryReader{中的代理
AttributeText(htmlContent:job.description)
.frame(高度:proxy.size.height,对齐方式:.center)
}
}
结构AttributeText:UIViewRepresentable{
让htmlContent:String
func makeUIView(上下文:context)->WKWebView{
返回WKWebView()
}
func updateUIView(uiView:WKWebView,context:context){
uiView.loadHTMLString(htmlContent,baseURL:nil)
}
}
结构AttributedText\u预览:PreviewProvider{
静态var预览:一些视图{
AttributeText(htmlContent:“这是HTML字符串”)
}
}
我还尝试使用GeometryReader来确定ScrollView的大小,但也没有成功

有没有办法使它看起来正常、美观、可滚动,并且具有适当的文本大小

提前多谢

编辑:在@RajaKishan的回答之后,它看起来是这样的(在这里你可以看到内容被切断了):


由于
WKWebView
已经滚动,并且您也被包装在滚动视图中,因此父滚动视图的大小不正确。 您必须禁用
WKWebView
滚动。另外,使用webview绑定大小并更新webview的框架

这是可能的演示

struct AttributedText: UIViewRepresentable {
    let htmlContent: String
    @Binding var size: CGSize
    
    private let webView = WKWebView()
    var sizeObserver: NSKeyValueObservation?
    
    func makeUIView(context: Context) -> WKWebView {
        webView.scrollView.isScrollEnabled = false //<-- Here
        webView.navigationDelegate = context.coordinator
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.loadHTMLString(htmlContent, baseURL: nil)
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(parent: self)
    }
    
    class Coordinator: NSObject, WKNavigationDelegate {
        let parent: AttributedText
        var sizeObserver: NSKeyValueObservation?
        
        init(parent: AttributedText) {
            self.parent = parent
            sizeObserver = parent.webView.scrollView.observe(\.contentSize, options: [.new], changeHandler: { (object, change) in
                parent.size = change.newValue ?? .zero
            })
        }
    }
}
struct AttributeText:UIViewRepresentable{
让htmlContent:String
@绑定变量大小:CGSize
私有let webView=WKWebView()
var sizeObserver:NSKeyValueObservation?
func makeUIView(上下文:context)->WKWebView{
webView.scrollView.IsScrolleEnabled=false//Coordinator{
协调员(家长:自我)
}
类协调器:NSObject,WKNavigationDelegate{
让家长:AttributeText
var sizeObserver:NSKeyValueObservation?
初始化(父级:AttributeText){
self.parent=parent
sizeObserver=parent.webView.scrollView.observe(\.contentSize,选项:[.new],changeHandler:{(对象,更改)在
parent.size=change.newValue???.zero
})
}
}
}
查看

@State private var size: CGSize = .zero

var body: some View{
    ScrollView {
        AttributedText(htmlContent: "<h1>This is HTML String</h1>", size: $size)
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, idealHeight: size.height, maxHeight: .infinity)
    }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
}
@State private var size:CGSize=.0
var body:一些观点{
滚动视图{
AttributeText(htmlContent:“这是HTML字符串”,大小:$size)
.frame(最小宽度:0,最大宽度:。无穷大,最小高度:0,理想高度:size.height,最大高度:。无穷大)
}.frame(最小宽度:0,最大宽度:。无穷大,最小高度:0,最大高度:。无穷大)
}

不幸的是,它无法工作,因为现在它根本无法滚动。因此,现在我只看到一行内容,没有任何机会滚动内容。请检查更新情况。@nolomanthanks!确实它看起来好多了!但如果内容占据的高度超过屏幕的高度,我仍然无法滚动。@RajaKishan我正在添加一个关于它是如何滚动的小视频现在是原版了post@noloman请查看更新后的ans。它现在非常有效!非常感谢!你是最棒的!这回答了你的问题吗?谢谢!这是一个很好的来源,我会看看我是否能从那篇文章中找到它,但现在,它没有帮助:(