2017-08-11 8 views
0

私は、各セルにUIWebViewが含まれ、ウェブビューの高さがセルの高さを決定するテーブルビューを持っています。テーブルビューはUITableViewAutomaticDimensionを使用します。UIWebViewの読み込みが完了したら、どのように強制的にUITableViewCellのレイアウトを変更できますか?

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の読み込みが完了したら、すぐにセルを展開することはできますか?

答えて

1

テーブルビューのコントローラを呼び出すデリゲートを作成する必要があります。このデリゲートをselfに設定してcellForRowAtに設定し、デリゲートの関数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) 
    } 
} 
+0

あなたはindexPath新しいheigthに合格した場合、より良いです –

関連する問題