【问题标题】:Calculating UIWebView height计算 UIWebView 高度
【发布时间】:2013-11-30 16:06:09
【问题描述】:

这个问题在Removing HTML url tags in iOS 上跟进。我决定采用 Web View 方法,因为这似乎是获得正确链接的最简单方法(也就是带有实际标题的链接,而不仅仅是 url)。但我被困在如何计算网络视图的高度上。我使用带有 Web 视图的表格视图单元格作为子视图。

我目前失败的方法:

  1. 表格视图询问单元格的高度

    - (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return [CommentTableViewCell heightForCellWithComment:(self.comments)[indexPath.row]];
    }
    

    这适用于文本视图,因为我可以使用boundingRectWithSize:options:attributes:context: 来计算文本高度,在顶部和底部添加一些填充,然后返回高度。使用网络视图,我无法做到这一点。我目前从网络返回的数据,其中仍然包含一些 html 标签,插入一些 html 来更改字体等,然后在 web 视图中呈现它。如果我使用boundingRectWithSize:options:attributes:context 之类的方法:返回的高度显然是不一样的。

  2. 这可能会尝试计算高度,但这不起作用并返回 0。commment 上的 body 属性包含 html 数据。

    + (CGFloat)heightForCellWithComment:(Comment *)comment
    {   
        CommentTableViewCell *cell = [[CommentTableViewCell alloc] init];
        [cell.textWebView loadHTMLString:comment.body baseURL:nil];
        cell.textWebView sizeThatFits:
               CGSizeMake(cell.textWebView.frame.size.width, CGFLOAT_MAX)];
    
        return cell.textWebView.frame.size.height + 48.0f; // 48 px padding
    }
    
  3. UITableViewDataSource 请求单元格。我从情节提要中取出一个单元格,并在其上设置 comment 属性。

    - (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        CommentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:...];
    
        Comment *comment = ...;
        cell.comment = comment;
    
        return cell;
    }
    

所以我想说的是,我正在寻找一种在所有表格视图开始之前计算 Web 视图尺寸的方法。提前谢谢你。

【问题讨论】:

    标签: ios objective-c uitableview uiwebview


    【解决方案1】:

    加载 HTML 字符串是异步完成的。您必须为UIWebView 设置一个代表并等待webViewDidFinishLoad: 调用。在此调用中,您可以通过访问webView.scrollView.contentSize.height 来查询 Web 视图的高度。然后您可以存储高度并告诉表格视图重新加载特定单元格,然后它将具有正确的高度。

    【讨论】:

    • 要获取 webView 所在的单元格,我需要弄乱视图层次结构(webview.superview.superview.superview ...)对吗?还是有更好的方法来做到这一点?子类化 UIWebView 来做这件事似乎有点太多了,类别不能有 ivar (afaik)。
    • 当然还有更好的办法:只要把cell指定为UIWebView的delegate,那么正确的cell就会收到webViewDidFinishLoad:的调用。
    • 使用自定义字体和 CSS 时,webView.scrollView.contentSize.height 的值不同于 webView.stringByEvaluatingJavaScript(来自:“document.body.scrollHeight”)。但在我的情况下,最后一个给出了正确的高度。不知道为什么。
    【解决方案2】:

    cell.textWebView 在您的 heightForCellWithComment: 方法中为零吗?如果您为单元格使用情节提要,则需要为此目的从表格视图中取出一个单元格,以便实际加载其视图。 (仅调用 alloc/init 不会从情节提要中创建子视图,例如 web 视图。)

    如果您不想将其从表视图中出列,您可以将视图内容移出到可以直接加载的单独 nib。 (出于性能原因,您可能应该加载/出列一次,然后在每次调用 heightForCellWithContent: 时重复使用它。)

    【讨论】:

      【解决方案3】:

      注意webViewDidFinishLoad:不是webView完成加载的实时时间。你最好使用:

      - (void)webViewDidFinishLoad:(UIWebView *)webView{
      // the real time of webView finish loading
      if ([webView isFinishLoading] == YES) {
          // do something you want
       }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2014-04-26
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 2015-08-24
        • 2011-12-11
        • 2015-11-15
        相关资源
        最近更新 更多