Swift WKWebView自适应高度实现

Swift 写 UITableViewCell 加载 WebView 时的自适应高度,确实挺让人头大的。Web 内容高度变来变去,cell 要跟着调,不好就会卡顿或者内容被截断。我之前也踩过不少坑,后来摸索出一套比较顺的做法——用WKWebView配合Auto Layout,再利用evaluateJavaScript拿到真实的内容高度,实时更新 cell 的高度。

核心思路蛮简单:cell 里放一个WKWebView,加载完成后拿document.body.scrollHeight,触发tableView.beginUpdates()刷新布局。这一套下来,内容能完整展示,滑动也流畅。

你要注意的是:cell 重用的时候记得清理,否则 WebView 会乱套。可以在prepareForReuse()里取消加载、清空内容什么的。最好是封装一个WebCell类,把加载逻辑和高度计算放一起,外面用起来也方便。

如果你之前在搞UITableViewAutomaticDimensionestimatedRowHeight这些自适应属性,这个技巧能无缝配合,用起来挺舒服。

哦对了,下面这段代码建议直接抄,用在WKWebView的加载完成回调里:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
  webView.evaluateJavaScript("document.body.scrollHeight") { (height, error) in
    if let height = height as? CGFloat {
      self.updateCellHeight(height)
    }
  }
}

整体效果还不错,适合加载富文本、文章详情页那种内容长度不固定的场景。如果你正好遇到类似需求,可以试试这个思路。

zip 文件大小:430.25KB