带标签的 UITableViewCell 动态高度

Posted

技术标签:

【中文标题】带标签的 UITableViewCell 动态高度【英文标题】:UITableViewCell dynamic height with label 【发布时间】:2011-09-02 09:20:13 【问题描述】:

我创建了一个带有 NIB 文件的 UITableViewCell。 其中有 1 个标签将包含一条推文。所以它需要是一个动态的高度。还有一个 timeAgo 标签必须放在 tweet 标签下面。

我正在尝试各种尺寸的框架,但我无法找到完美的解决方案.. 我在 drawrect 方法的 UITableViewCell 文件中执行此操作。

self.tweet.lineBreakMode = UILineBreakModeWordWrap;
self.tweet.numberOfLines = 0;
self.tweet.font = [UIFont fontWithName:@"Arial" size:13.0f];
[self.tweet sizeToFit];  

CGFloat tweetHeight = self.tweet.frame.size.height;

self.timeAgo.lineBreakMode = UILineBreakModeWordWrap;
self.timeAgo.numberOfLines = 0;
self.timeAgo.font = [UIFont fontWithName:@"Arial" size:11.0f];
[self.timeAgo sizeToFit];

CGFloat timeAgoHeight = self.timeAgo.frame.size.height;

self.timeAgo.frame = CGRectMake(88, tweetHeight, 100, timeAgoHeight + 10.0f);

我还尝试了一个在教程中找到的 stringhelper。

- (CGFloat)RAD_textHeightForSystemFontOfSize:(CGFloat)size 

我的 HeightForRow 方法也已经不同,因为我使用了不同的单元格样式。 目前我为每个单元格样式返回一个硬值,但这也需要更改为单元格高度。

【问题讨论】:

【参考方案1】:

请参阅本教程,http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/

诀窍是让标签随着单元格的大小而增长,而不是你可以只设置单元格的大小,单元格就会随之增长。

设置 timeAgo 标签使其与单元格底部对齐。

通过IB设置tweet的numberOfLines为0,重新移动所有的draw代码,只实现如下:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    id item  = [self.item objectAtIndex:indexpath.row];

    CGFloat height = 85.0f;

    if ([item isKindOfClass:[Tweet class]]) 
        Tweet *tweet = (Tweet *)item;
        CGSize titleSize = [tweet.tweet sizeWithFont:[UIFont fontWithName:@"Arial" size:13.0f] constrainedToSize:CGSizeMake(260.0f, MAXFLOAT)];

        // adde the 24 pixels to get the height plus the time ago label.
        height =  titleSize.height + 24.0f;

     else if( [item isKinfOfClass:[SC_Release class]]) 
        height = 65.0f;
    

   return height;

【讨论】:

嗯,它不是很好 atm =p cl.ly/1Y00411b0F0N0h2R2G2z / cl.ly/3t0g3L1r1k3h0M163m2i 感谢编辑!但问题是包含推文文本的标签,它没有调整大小或其他东西。 cl.ly/2t2Q2P0p3g2v0Y0Y2d2u 是的,但我认为由于用户名的原因,您需要增加 24 像素以匹配 y 偏移量。还要确保单元格至少是图像的高度。还要检查 CGSize 中的 16.0f 是否是标签的宽度(260.0f 只是一个例子)。 感谢我添加后它工作正常:self.tweet.lineBreakMode = UILineBreakModeWordWrap; self.tweet.numberOfLines = 0; [self.tweet sizeToFit];到drawrect。感谢分配!梅比,我会在 Appsterdam 见到你一段时间;) :D 肯定会参加 Appsterdam 聚会喝酒。【参考方案2】:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    NSString *string = [tweetsArray indexPath.row];
    CGSize labelSize = [string sizeWithFont:[UIFont fontWithName:@"Verdana" size:17.0] 
                                                     constrainedToSize:CGSizeMake(280.0f, MAXFLOAT) 
                                                         lineBreakMode:UILineBreakModeWordWrap];
    return labelSize.height + 20;

【讨论】:

这种方法也很不错。不过,我没有与其他任意数组交谈,而是从字面上获取带有 [self tableView:tableView cellForRowAtIndexPath:indexPath] 的单元格,并从单元格的 textLabel.text 属性中提取文本值。

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

UITableViewCell,使用多个标签设置动态高度

根据标签文本长度动态自定义 UITableViewCell 的高度

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

UITableViewCell中带有图像的动态标签?

Swift中基于标签文本长度的动态自定义UITableViewCell的高度

具有动态高度的 UITableViewCell 中的多个 UILabel