UIWebView 完成加载后,如何强制重新布局 UITableViewCell?

Posted

技术标签:

【中文标题】UIWebView 完成加载后,如何强制重新布局 UITableViewCell?【英文标题】:How can I force re-layout of UITableViewCell when UIWebView finished loading? 【发布时间】:2017-08-11 19:32:41 【问题描述】:

我有一个表格视图,其中每个单元格都包含一个UIWebView,并且网络视图的高度决定了单元格的高度。表格视图使用UITableViewAutomaticDimension

class TitleTableViewCell: UITableViewCell 

    @IBOutlet weak var webViewHeight: NSLayoutConstraint!
    @IBOutlet weak var webView: UIWebView!

    override func awakeFromNib() 
        super.awakeFromNib()
        webView.scrollView.isScrollEnabled = false
        webView.delegate = self
    

    func configure(content: String?) 
        if let contenthtml = content 
            let html = ("<body style=\"font-family: '-apple-system'; font-size: 16; font-weight: bold; line-height: 135%; overflow-wrap: break-word\"><style>atext-decoration: none; color: #d64a32;imgmax-width:100%; height: auto; margin: 12px 0px;iframemax-width:100%; height: auto;</style><p style=\" text-align: left\">\(contentHTML)</p></body>")
            webView.loadHTMLString(html, baseURL: nil)
        
       
 
extension TitleTableViewCell: UIWebViewDelegate 

    func webViewDidFinishLoad(_ webView: UIWebView) 
        webViewHeight.constant = webView.scrollView.contentSize.height
        layoutIfNeeded()
    

当我推动这个屏幕时,单元格的高度是我在estimatedRowHeight 中定义的高度,但直到我再次弹出并推动屏幕时它才会扩展到全高。 webview完成加载后,如何强制扩展单元格?

【问题讨论】:

【参考方案1】:

您应该创建一个调用表视图控制器的委托。您应该在cellForRowAt 中将此委托设置为self,并为委托函数cellWebViewDidFinishLoad 中引用的索引路径重新加载单元格。

Delegates.swift

protocol TitleCellDelegate: class 
    func cellWebViewDidFinishLoad(_ indexPath: IndexPath)

TitleTableViewCell.swift

class TitleTableViewCell: UITableViewCell 
    weak var delegate: TitleCellDelegate?
    fileprivate var indexPath: IndexPath!

    func configure(content: String?, indexPath: IndexPath) 
        [...]

        self.indexPath = indexPath
       
 

extension TitleTableViewCell: UIWebViewDelegate 
    func webViewDidFinishLoad(_ webView: UIWebView) 
        webViewHeight.constant = webView.scrollView.contentSize.height
        layoutIfNeeded()
        delegate?.cellWebViewDidFinishLoad(indexPath)
    

【讨论】:

如果你用 indexPath 传递新的高度会更好

以上是关于UIWebView 完成加载后,如何强制重新布局 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

加载完成后,Gmail 如何强制自己成为活动标签?

如何调整 UIImageView 的大小并强制重新布局父 UITableViewCell

UIWebView 显示空白,除非重新加载

UIWebView、SearchBar 和 TabBar 在横向重新加载视图后无法正确调整大小?

如何在加载后强制 iFrame 重新加载

部署后如何强制客户端重新加载?