计算UIWebView高度

时间:2013-11-30 16:06:10

标签: ios objective-c uitableview uiwebview

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

我当前的失败方法:

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

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

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

  2. 这可能会尝试计算高度,但这不起作用并返回0. body上的commment属性包含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;
    }
    
  4. 所以我想说的是在所有桌面视图开始之前计算网页视图尺寸的方法。提前谢谢。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

cell.textWebView方法中heightForCellWithComment:为零吗?如果您正在为单元格使用故事板,则需要从表视图中将单元格出列以实现此目的,以便实际加载其视图。 (只是调用alloc / init不会从故事板创建子视图,如webview。)

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

答案 2 :(得分:0)

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

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