UITableViewCell 的动态高度

Posted

技术标签:

【中文标题】UITableViewCell 的动态高度【英文标题】:Dynamic height for UITableViewCell 【发布时间】:2012-01-05 12:01:19 【问题描述】:

我使用 UIWebView 作为 UITableViewCell 的内容。当我添加 UITableView 时,我为 UITableViewCell 使用了一些恒定的高度。因为 UIWebView 中没有加载任何内容。当在 UIWebView 中添加实际内容时,我可以通过使用 [UIWebView sizeThatFits:CGSizeZero] 获得 UIWebView 的实际高度;

现在的问题是 UIWebView 的高度合适,但单元格的高度小于 UIWebView 的新高度。如何更新该单元格的高度?

【问题讨论】:

它可能对您有所帮助或可能重复。 ***.com/questions/8665812/… 我需要以相同的方式实现,但在上面的示例中,它的文本,在我的情况下,我从服务器下载内容,然后添加到 UIWebView。 【参考方案1】:

UIWebView 完成加载后,您应该调用

[tableView beginUpdates];
[tableView endUpdates];

这将再次调用-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 将调整您的 UITableViewCell 的大小。在该方法中,您可以根据 UIWebView 的大小计算单元格的新高度。

【讨论】:

“beginUpates”中的错字。应该是“beginUpdates” 你到底把*Updates方法调用放在哪里了? 更新负责计算/返回单元格高度的对象后。 如果对象位于 uitableviewcell 中,您将如何做到这一点?它只是以无限递归调用结束......【参考方案2】:

把这个方法放在你的代码中它会起作用的

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [[arrLocation objectAtIndex:indexPath.row] sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    return labelSize.height + 5;

【讨论】:

【参考方案3】:

您可以参考此示例寻求帮助:

http://github.com/penso/webview-in-tableview

试试这个代码:

- (void)viewDidLoad 
        [super viewDidLoad];
        self.title = @"Webview in UITableView";
        webview = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)]; // Don't use CGRectZero here, won't work
        webview.delegate = self;
        webview.hidden = YES;

        [webview loadRequest:[[NSURLRequest alloc] 
                              initWithURL: [NSURL URLWithString:@"http://www.google.com/"]]];

        [self.tableView setTableFooterView:webview]; // Leave this, else you'll have rows to fill the rest of the screen

    

    - (void) webViewDidFinishLoad:(UIWebView *)webView 
        float newSize = [[webView stringByEvaluatingjavascriptFromString:@"document.documentElement.scrollHeight"] floatValue];
        NSLog(@"Resizing webview from %.2f to %.2f", webView.frame.size.height, newSize);
        webView.frame = CGRectMake(webView.frame.origin.x, webView.frame.origin.y, webView.frame.size.width, newSize);
        webView.hidden = NO;

        // We need to reset this, else the new frame is not used.
        [self.tableView setTableFooterView:webview];
    

【讨论】:

【参考方案4】:

在此方法中,您可以动态更改行高

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

【讨论】:

在 - (void)webViewDidFinishLoad:(UIWebView *)aWebView [iListTableView beginUpdates]; [iListTableView endUpdates]; 调用它但没有成功。

以上是关于UITableViewCell 的动态高度的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 的动态高度

在动态高度 UITableViewCell 出现后更改其高度

动态高度 UITableViewCell 闪烁

Swift / 如何使用具有动态高度的 UITextView INSIDE UITableViewCell 与动态高度

带标签的 UITableViewCell 动态高度

我需要设置 UITableViewCell 动态高度,带有 UIImageView 的多个动态标签