昨天自己在做个小项目的时候,需要用到 webView 加载 html 文本内容,技术上选用 UIView 还是 WKWebView不在本篇讨论范围,其中一个场景是加载完之后获得 webView 实际的高度,再设置 webView 的高度,类似常用的商品详情 UI,实现起来不能,利用 kvo 监听 webview 子控件 scrollView 的contentSize属性的变化即可。
这里我用的是 rxSwift 实现的。
self.detailWebView.scrollView.rx.observe(CGSize.self, "contentSize").subscribe(onNext: {[weak self] size in
let height = size?.height ?? 0
self?.detailWebView.jk_height = height + 10
}).disposed(by: disposeBag)
因为业务场景需要在 webview 加载出来后需要再加上10的高度,
本以为大功告成了,结果发现detailWebView的监听回调一直在执行,打印出来的高度一直不断累加上去,这就不懂了,以前也是这么写的一直都没问题,这次用了 rxSwift就有问题?于是我先换了用传统的 KVO 写法,结果还是一样,排除这个原因。
难道是 webView 加载的 html 内容的问题?换了用某个网址代替,结果还是一样,排除这个原因。
一步一步排查,先把回调里面的代码去掉,重新运行发现不再出现这种情况,难道是这个高度值有问题吗?于是试了勇哥具体的高度给 webView 赋值,结果同样不会出现这种错误。
那为什么设置了返回的高度height + 10就有问题呢?试着把10去掉,结果发现也不会出现上面的错误,这一下终于明白了。
原来“contentSize”这个这个属性不仅仅是 webView 内容发生变化就会变化,如果设置了 webView 的 Frame,同样会发生变化。我的错误在于,监听到 height 变化后,在把 webView 的高度设置为 Height+10,实际上 webView 的真实高度只有height,加了10,就触发了contentSize的变化,触发回调,回调又一次加10,不断循环,所以造成了上面的错误。。。无语,被自己蠢哭。。。
另外,一般后台返回的 HTML 文本内容都不设置字体大小和图片自适应手机屏幕,是不是这么懒啊?不过我们 app 端还是可以解决的,那就是自己补上 html 样式文本。
HTMLAutoLayout






网友评论