SwiftUI:在滚动视图中显示HTML文本
我试图在我正在制作的应用程序中显示一些HTML文本,但我无法让它正常工作。 问题是,包含文本的视图总是以一行的高度显示,即使它被包装在滚动视图中。在屏幕截图中,你们可以看到ScrollView可以工作,但原始大小非常小 代码是:SwiftUI:在滚动视图中显示HTML文本,swift,swiftui,nsattributedstring,geometryreader,Swift,Swiftui,Nsattributedstring,Geometryreader,我试图在我正在制作的应用程序中显示一些HTML文本,但我无法让它正常工作。 问题是,包含文本的视图总是以一行的高度显示,即使它被包装在滚动视图中。在屏幕截图中,你们可以看到ScrollView可以工作,但原始大小非常小 代码是: ScrollView { GeometryReader { proxy in AttributedText(htmlContent: job.description)
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。它现在非常有效!非常感谢!你是最棒的!这回答了你的问题吗?谢谢!这是一个很好的来源,我会看看我是否能从那篇文章中找到它,但现在,它没有帮助:(