如何根据其中的组件设置UITableViewCell高度

时间:2013-01-23 20:09:17

标签: ios objective-c uitableview

我创建了一个UITableViewCell的子类,其中包含UITextView。设置UITextView中的文本后,它会自动调整大小以使高度增加但宽度保持不变。

我现在想要使用下面显示的方法根据其中UITableViewCell的高度动态设置每个UITextView的高度。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Some code to pull in the subclassed UITableViewCell & set 
    // the height based on the UITextView within it.
}

有人可以建议如何/如果可能的话?要清楚这是让我的自定义单元从这个方法导致我的问题,显然我可以施展它,但这对我来说似乎不对。有人可以建议如何做到这一点吗?

3 个答案:

答案 0 :(得分:1)

创建具有正确宽度的UITextView,然后在textview上设置文本。 致电[textview sizeToFit]。从textview获取高度,然后添加你需要的任何额外高度等同于它在UITableViewCell子类中的高度。

使用NSString的sizeWithFont:constrainedToSize:lineBreakMode:会很不错,但根据我的经验,这通常会在不同的地方打破字符串,而不是相同大小的UITextView,所以它不可靠。您的文本在UITextView中通常需要比NSString sizeWithFont:constrainedToSize:lineBreakMode:建议的更多或更少的行。

答案 1 :(得分:1)

每次UITextView内容更改时,都需要重新计算并更新相关的单元格高度。您不能只设置新的单元格高度,tableView应该通过调用其委托方法tableView:heightForRowAtIndexPath:来询问它。要强制tableView重新计算其单元格大小,请调用空[tableView beginUpdates] / [tableView endUpdates]块。
 我的TableKit库中有一个ReminderSample演示,可以显示此功能。

答案 2 :(得分:0)

这是一个真实世界的例子。在这个应用程序中,只调整第三部分中的单个单元格,如果您想要调整任何单元格的大小,您应该在NSMutableDictionary中保存大小(在我的示例descriptionLableSize中)并在tableView:cellForIndexPath:中使用它

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *description = [self.modelObject valueForKey:@"descriptionText"];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);

    //if needed save the size in a dictionary for each indexPath
    descriptionLableSize = [description sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    if (indexPath.section == 2){
        NSUInteger h = descriptionLableSize.height + 20;
        h = (h < 44) ? 44:h;
        return h;
    }
    return 44.0;
}



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

    //....
    if (section == 2) {

        NSString *description = [self.modelObject valueForKey:@"descriptionText"];
        cell.textLabel.text = description;
        [cell.textLabel setNumberOfLines:0];
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;

    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;

}