UITableViewCell嵌套UIWebView

项目需求:UITableViewCell嵌套UIWebView,并且让UIWebView根据内容自适应高度。

1 获取UIWebView高度

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // 如果要获取webView高度必须在网页加载完成之后获取

    // 方法一
    CGFloat height = [self.webView sizeThatFits:CGSizeZero].height;

    // 方法二
    CGFloat height = webView.scrollView.contentSize.height;

    // 方法三 (不推荐使用,当webView.scalesPageToFit = YES计算的高度不准确)
    CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
}

2 UIWebView加载完成后cell高度的更新,使用通知来实现。

TableViewCell.m

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGSize fittingSize = [self.webView sizeThatFits:CGSizeZero];
    self.height = fittingSize.height;
    self.webView.frame = CGRectMake(0, 0, fittingSize.width, fittingSize.height);

    // 用通知发送加载完成后的高度
    [[NSNotificationCenter defaultCenter] postNotificationName:@"WEBVIEW_HEIGHT" object:self userInfo:nil];
}

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 用于缓存cell高度
    self.heightDic = [[NSMutableDictionary alloc] init];

    // 注册加载完成高度的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noti:) name:@"WEBVIEW_HEIGHT" object:nil];
}

- (void)noti:(NSNotification *)sender
{
    TableViewCell *cell = [sender object];

    if (![self.heightDic objectForKey:[NSString stringWithFormat:@"%ld",cell.tag]]||[[self.heightDic objectForKey:[NSString stringWithFormat:@"%ld",cell.tag]] floatValue] != cell.height)
    {
        [self.heightDic setObject:[NSNumber numberWithFloat:cell.height] forKey:[NSString stringWithFormat:@"%ld",cell.tag]];
       [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:cell.tag inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
    }
}

图片1

3 完整项目工程

https://github.com/YiQieSuiYuan/Demo/tree/master/WebView_cell

4 参考

http://www.jianshu.com/p/e199496a8b8a

在 “UITableViewCell嵌套UIWebView” 上有 6 条评论

  1. I and also my pals came reviewing the good hints from the blog and suddenly came up with a horrible feeling I never thanked the web site owner for those strategies. Those women happened to be for that reason warmed to learn all of them and have now without a doubt been having fun with those things. Thank you for being simply accommodating and then for considering this kind of helpful areas most people are really needing to be informed on. My personal sincere regret for not expressing appreciation to you sooner.

  2. 这确定没bug?加载完成发送通知,tableView重新reload,一个tableView多个cell 嵌套web的话。这样处理可妥?

  3. 当cell过多时,会出现问题. 快速滑动时传入的tag值突然增大,然后reloadRowAtIndexPath失败.
    用reloadData 屏幕会闪~

发表评论

电子邮件地址不会被公开。 必填项已用*标注