UITableViewCell含有WebView的自适应高度新解决方案
时间: 2023-07-22 17:07:56 浏览: 81
对于UITableViewCell中包含WebView的自适应高度问题,一般的解决方案是在webViewDidFinishLoad方法中计算WebView的高度,并更新UITableViewCell的高度。但是这种方法有时会出现计算不准确的情况,以及性能问题。
最新的解决方案是使用iOS 11中引入的UITableViewAutomaticDimension,结合约束自动布局来实现UITableViewCell的自适应高度。具体步骤如下:
1. 在Storyboard或XIB中,设置UITableViewCell的约束,包括WebView的顶部、底部、左右两侧的约束,并将WebView的高度设置为大于等于0的值(可以是一个较小的值,比如10)。
2. 在tableView(_:cellForRowAt:)方法中,设置WebView的代理为当前的UITableViewCell,并在webView(_:didFinish:)方法中更新UITableViewCell的高度:
```swift
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// 计算WebView的内容高度
webView.evaluateJavaScript("document.readyState") { (result, error) in
if result != nil {
webView.evaluateJavaScript("document.body.offsetHeight", completionHandler: { (height, error) in
if let height = height as? CGFloat {
// 更新UITableViewCell的高度
self.heightConstraint.constant = height
self.setNeedsUpdateConstraints()
self.updateConstraintsIfNeeded()
self.layoutIfNeeded()
self.delegate?.didUpdateHeight()
}
})
}
}
}
```
3. 在tableView(_:estimatedHeightForRowAt:)方法中,返回一个估算的高度(可以是一个较小的值,比如100):
```swift
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
```
4. 在tableView(_:heightForRowAt:)方法中,返回UITableViewAutomaticDimension:
```swift
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
```
注意:在使用约束自动布局的情况下,需要保证UITableViewCell的高度约束是完整的,即顶部和底部都有约束,否则自适应高度可能会出现问题。同时,在更新UITableViewCell的高度时,需要调用setNeedsUpdateConstraints、updateConstraintsIfNeeded和layoutIfNeeded方法,以保证约束的更新及时生效。