在 UITableViewCell 内渲染 UIWebView

Posted

技术标签:

【中文标题】在 UITableViewCell 内渲染 UIWebView【英文标题】:Render UIWebView inside UITableViewCell 【发布时间】:2018-10-17 10:04:33 【问题描述】:

谁能告诉我我做错了什么?

我有一个 tableCell,里面有一个 stackView,里面有一个以编程方式添加的 UIWebview。

class ChatTableViewCell: UITableViewCell 

  @IBOutlet var stackView: UIStackView!
  func setupCell(message: ChatMessage) 

        addhtmlToView(msg: "<p>This is <b>bold text</b></p>")
    

 func addHtmlToView(msg: String) 
         let webView = UIWebView()
        webView.loadHTMLString("<html><body><div id='mainHtml'>" + msg + "</div></body></html>", baseURL: nil)
        webView.backgroundColor = UIColor.clear
        webView.isOpaque = false
        webView.delegate = self
        webView.scrollView.isScrollEnabled = false
        webView.scrollView.bounces = false
        webView.backgroundColor = .red
        webView.scrollView.contentInset = UIEdgeInsets(top: -8, left: -8, bottom: -8, right: -8)
        webView.translatesAutoresizingMaskIntoConstraints = false

        self.stackView.addArrangedSubview(webView)

        heightWebViewConstraint = NSLayoutConstraint(item: webView, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 10)
        widthWebViewConstraint = NSLayoutConstraint(item: webView, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 1)

         webView.addConstraint(heightWebViewConstraint)
         webView.addConstraint(widthWebViewConstraint)

        NSLayoutConstraint.activate([ heightWebViewConstraint, widthWebViewConstraint])

    


extension ChatTableViewCell: UIWebViewDelegate 

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool 
       if navigationType == UIWebView.NavigationType.linkClicked 
        UIApplication.shared.openURL(request.url!)
        return false
    
    return true


func webViewDidFinishLoad(_ webView: UIWebView) 
    webView.frame.size.height = 1.0        
    webView.sizeToFit()

    let result = NumberFormatter().number(from: webView.stringByEvaluatingjavascript(from: "document.getElementById('mainHtml').offsetHeight") ?? "0")

    heightWebViewConstraint.constant = 200        

在此之后,单元格呈现如下 接下来我将使用“结果”中的值,但这也不适用于硬编码值

【问题讨论】:

您还没有做的一件事是将您的宽度和高度约束添加到任何东西(就代码显示而言)。您创建它们并将它们分配给变量,然后尝试激活它们,但是您实际上在哪里将它们添加到任何视图中。您可能需要将它们添加到 Web 视图中,并且可能还需要添加一些其他约束来确定其位置。 我在写这篇文章时做过 -> heightWebViewConstraint = NSLayoutConstraint(item: webView ....) 这个 webView 在 Xib 上的 StackView 设计中 所做的只是创建约束,它不会将其添加到任何视图中。你需要做类似webView.addConstraint(heightWebViewConstraint的事情。 我会编辑我的代码,但这不起作用,并且单元格看起来像同一个 XD 嗯,这只是我对一个问题的最初想法,可能还有其他问题。首先,我建议使用您现在添加约束的方式更新代码。此外,堆栈视图设置如何以及单元设置其他部分的约束如何。还有你期待什么,因为它只有 1 点宽和 10 点高。 【参考方案1】:

我认为您必须将 Stack 视图的 Distribution 属性添加为“Fill Equally”

【讨论】:

以上是关于在 UITableViewCell 内渲染 UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 重用和图像重新渲染

UITableViewCell 背景渐变在第一次渲染时不起作用

向 uitableviewcell 发送新值并重新渲染

UILabel 位置在 UITableviewcell 内没有改变

在 UITableViewCell 内水平滚动 UIScrollView

防止 CAGradientLayer 在 UITableViewCell 上的 UIImageView 内重叠