根据webview内容更改UITableViewCell高度

时间:2017-02-28 21:38:14

标签: uitableview nslayoutconstraint

我有一个嵌套在UITableViewCell中的UIWebView。

如何调整单元格的高度取决于我加载到WebView中的内容(即在完成下载后)......?

我有tableview将heightForRowAtPath设置为UITableViewAutomaticDimension

loadContentIntoWebview由TableView的所有者在其cellForRowAt委托方法中调用。

我注意到在heightForRowAt之前调用了cellForRowAt所以我根据单元格的webview内容大小设置高度的“解决方案”将不起作用。

import UIKit

class MyCell: UITableViewCell, UIWebViewDelegate {

  // MARK: - instance variables

  @IBOutlet weak var myWebview: UIWebView?



  // MARK: - lifecycle methods

  override func awakeFromNib() {
    super.awakeFromNib()

    myWebview?.scrollView.bounces = false;
  }

  override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state
  }



  // MARK: - private methods

  func loadContentIntoWebview(htmlString: String) {
    myWebview?.loadHTMLString(htmlString, baseURL: nil)
  }



  // MARK: - UIWebViewDelegate methods

  func webViewDidFinishLoad(_ webView: UIWebView) {
    // dynamically set WebView height
    let tempString = myWebview?.stringByEvaluatingJavaScript(from: "document.body.scrollHeight")
    var tempHeight: CGFloat = 0.0
    if let n = NumberFormatter().number(from: tempString!) {
      tempHeight = CGFloat(n)
    }

    myWebview?.frame.size.height = tempHeight
  }
}

2 个答案:

答案 0 :(得分:0)

func webViewDidFinishLoad(_ webView: UIWebView) {
    if let cell :yourCell = self.yourTblVw.cellForRow(at: yourindexpath) as? yourCell{

        // set height of webview as per its content
        var frame = cell.webView.frame
        frame.size.height = 1
        let fittingSize = cell.webView.sizeThatFits(CGSize.zero)
        frame.size = fittingSize
        cell.heightWebVwMain.constant = fittingSize.height
       }

其中heighWebVwMain是您单元格webview高度的约束。所以你必须在cellforRow方法中设置这个常量

答案 1 :(得分:0)

找到解决方案......

  • webViewDidFinishLoad(_ webView: UIWebView)中设置约束条件 如初始问题中的高度,但请使用document.body.clientHeight
  • 发布通知,告知关联的tableview不是reloadData(),而是beginUpdates()然后endUpdates()
@objc func handleWebviewFinishedLoading() {
    self.webview?.beginUpdates()
    self.webview?.endUpdates()
}

这似乎重绘了单元格而没有重新加载它们:)