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高度的更新,使用通知来实现。


- (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];


- (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];


3 完整项目工程


4 参考


在 “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 屏幕会闪~


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