在 UITableViewCell 中加载 UIWebView 并根据 UIWebview 的内容制作 UITabViewCell 的高度

Posted

技术标签:

【中文标题】在 UITableViewCell 中加载 UIWebView 并根据 UIWebview 的内容制作 UITabViewCell 的高度【英文标题】:Load UIWebView in UITableViewCell and Make UITabViewCell's height as per the content of UIWebview 【发布时间】:2015-03-03 10:45:29 【问题描述】:

我正在开发一个项目,其中有一个包含 UIImageView、UILable 和 UIWebView 的 UITableViewCell。 我需要在 didselectrowatIndexpath 方法上打开一个 webview(其中添加了 html 字符串),并且单元格高度应该增加到 UIWebView 的内容大小。我试过以下代码。但这并没有按预期工作。请多多指教。

#pragma mark - Table view data source
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return [faqContentArray count];

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath 
     FAQCell *cell = (FAQCell*)[tableView cellForRowAtIndexPath:indexPath];
    [cell.faqContentWebView loadHTMLString:[[faqContentArray objectAtIndex:indexPath.row] objectForKey:@"content"] baseURL:nil];
    NSString *wrappedText = [[faqContentArray objectAtIndex:indexPath.row] objectForKey:@"content"];
    cell.faqContentWebView.frame=CGRectMake(8.0f, 43.0f, 304.0f, [self minHeightForText:wrappedText]);


    [self rotateIconToExpanded:cell.faqImage];
     [self.faqTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];

//-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
//     FAQCell *cell = (FAQCell*)[tableView cellForRowAtIndexPath:indexPath];
//    
//    [cell.faqContentWebView loadHTMLString:@"" baseURL:nil];
//    cell.faqContentWebView.frame=CGRectMake(8.0f, 43.0f, 304.0f, 5);
//    [self rotateIconToCollapsed:cell.faqImage];
//     [self.faqTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
//

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    FAQCell *cell = (FAQCell*)[tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    if (!cell) 
        [tableView registerNib:[UINib nibWithNibName:@"FAQCell" bundle:nil] forCellReuseIdentifier:@"MyCell"];
        cell = (FAQCell*)[tableView dequeueReusableCellWithIdentifier:@"MyCell"];
        cell.selectionStyle=UITableViewCellSelectionStyleNone;
     



    cell.faqContentWebView.delegate=self;
    cell.faqContentWebView.layer.cornerRadius = 0;
    cell.faqContentWebView.userInteractionEnabled = NO;
    cell.faqContentWebView.multipleTouchEnabled = YES;
    cell.faqContentWebView.clipsToBounds = YES;

    cell.faqContentWebView.scalesPageToFit = NO;
    cell.faqContentWebView.scrollView.scrollEnabled = NO;
    cell.faqContentWebView.scrollView.bounces = NO;
    cell.faqContentWebView.autoresizingMask=UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;

    cell.faqTitleLbl.text=[[faqContentArray objectAtIndex:indexPath.row] objectForKey:@"title"];
    cell.faqImage.image=[UIImage imageNamed:@"downarow.png"];

    return cell;

- (void)rotateIconToExpanded:(UIImageView *)iconImage 
    [UIView beginAnimations:@"rotateDisclosure" context:nil];
    [UIView setAnimationDuration:0.2];
    iconImage.transform = CGAffineTransformMakeRotation(M_PI * 2.5);
    [UIView commitAnimations];


- (void)rotateIconToCollapsed:(UIImageView *)iconImage 
    [UIView beginAnimations:@"rotateDisclosure" context:nil];
    [UIView setAnimationDuration:0.2];
    iconImage.transform = CGAffineTransformMakeRotation(M_PI * 2);
    [UIView commitAnimations];


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    id celll = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    FAQCell *cell=(FAQCell *)celll;
    [cell setNeedsLayout];
    [cell layoutIfNeeded];
    NSLog(@"height------>%f",[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height);
    return [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

【问题讨论】:

【参考方案1】:

您需要计算(并可能监控)UIWebView 中内容的大小。一种方法是通过UIWebViewUIScrollView

CGFloat webViewContentHeight = myWebView.scrollView.contentSize.height;

另一个是:

CGFloat webViewContentHeight = [myWebView stringForEvaluatingjavascript:@"document.body.offsetHeight"].floatValue;

当您检索到该高度很重要时,您将在 UIWebView 的内容完成加载后需要它(例如,一旦它具有您可以使您的 UITableViewCell 的约束无效/更新)。

【讨论】:

以上是关于在 UITableViewCell 中加载 UIWebView 并根据 UIWebview 的内容制作 UITabViewCell 的高度的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 如何知道从数组或字典中加载啥 JSON

Swift 4:无法在包中加载 NIB:自定义 UITableViewCell 的“NSBundle”(无 IB)

在 collectionView 中加载图像

Swift 2 - 无法在单独的 ViewController 中加载 UIWebView

UITableviewcell加载数据问题

使用多个笔尖在 UITableViewCell 中动态获取行高