【问题标题】:How can I force re-layout of UITableViewCell when UIWebView finished loading?UIWebView 完成加载后,如何强制重新布局 UITableViewCell?
【发布时间】: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>a{text-decoration: none; color: #d64a32;}img{max-width:100%; height: auto; margin: 12px 0px;}iframe{max-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完成加载后,如何强制扩展单元格?

【问题讨论】:

    标签: ios swift uitableview dynamic uiwebview


    【解决方案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 传递新的高度会更好
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 2015-01-28
    • 2016-05-21
    • 2019-05-29
    • 2011-12-12
    • 2012-06-13
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多