显示带有评论的文章,​​例如 Medium 应用程序

Posted

技术标签:

【中文标题】显示带有评论的文章,​​例如 Medium 应用程序【英文标题】:Displaying article with comments like Medium app 【发布时间】:2017-07-12 02:19:45 【问题描述】:

在我的 iOS 应用程序中,我想显示动态大小的文章,然后是在 Medium 应用程序中执行的 cmets。这篇文章可以有随机顺序的视频和文本。我正在尝试使用 UITableView 来完成这项任务。在我的自定义表格视图单元格中,有 WKWebView,我在其中显示 Web 内容。我正在使用 WKWebView 的属性检查内容大小

webView.scrollView.contentSize.height

它返回一些 URL 的代理高度,但有时它返回内容高度 0。有时它只加载半页。 所以我对这个任务有一些疑问:

1) 为此目的使用 UITableView 是最好的方法吗?如果它不好,那么应该有什么替代方案。

2) 我正在使用 WebKit 来显示网页内容。当我在视图控制器中显示数据时它工作正常,但是当它在 UITableViewCell 中时它的行为是不同的。在 UITableViewCell 内部,加载页面需要一段时间,它不会加载整个页面,有时它根本不加载页面。那么是否推荐在 UITableViewCell 中使用 WebKit 呢?如果这是好方法,那么我该如何摆脱这些问题

【问题讨论】:

【参考方案1】:
extension ContentViewController:  WKUIDelegate, WKNavigationDelegate 
    //webview content cell

    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) 
        //        print("didCommitNavigation");

        //        if webView.isLoading == true 
        //            self.contentSize = 300
        //            return
        //        



        let javascriptString = "" +
            "var body = document.body;" +
            "var html = document.documentElement;" +
            "Math.max(" +
            "   body.scrollHeight," +
            "   body.offsetHeight," +
            "   html.clientHeight," +
            "   html.offsetHeight" +
        ");"

        webView.evaluateJavaScript(javascriptString)  (result, error) in
            if error == nil 
                //                print(result as! CGFloat)
                guard result is CGFloat else 
                    return
                

                self.contentSize =   result as! CGFloat

                if self.contentSize < 300 
                    self.contentSize = 300
                

                DispatchQueue.main.async(execute: 
                    self.tableView?.beginUpdates()
                    self.tableView?.endUpdates()

                )
            
        


    

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 


        let javascriptString = "" +
            "var body = document.body;" +
            "var html = document.documentElement;" +
            "Math.max(" +
            "   body.scrollHeight," +
            "   body.offsetHeight," +
            "   html.clientHeight," +
            "   html.offsetHeight" +
        ");"


        webView.evaluateJavaScript(javascriptString)  (result, error) in
            if error == nil 
                //                print(result as! CGFloat)
                //                UIApplication.shared.isNetworkActivityIndicatorVisible = false


                let finishContentSize = result as! CGFloat

                if self.contentSize == finishContentSize 
                    return
                

                //                self.tableView.height
                DispatchQueue.main.async(execute: 
                    self.contentSize =   finishContentSize

                    self.tableView?.beginUpdates()
                    self.tableView?.endUpdates()
                )


            

        
    

 

您可以使用 javascript 获取内容高度

【讨论】:

以上是关于显示带有评论的文章,​​例如 Medium 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

评论Iphone应用程序

Django视图和模板

逐段评论系统

存储树数据的快速关系方法(例如文章的线程评论)

Part3:视图和模板

在 Laravel 中获取用户名和带有文章 id 的评论