2

我创建了一个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.
}

请有人建议如何/如果这可能吗?需要明确的是,这是从这种方法中获取我的自定义单元格导致了我的问题,显然我可以直接转换它,但这对我来说似乎不合适。请有人建议如何做到这一点?

4

4 回答 4

1

创建一个宽度正确的 UITextView,然后在 textview 上设置文本。打电话[textview sizeToFit]。从 textview 获取高度,然后添加您需要的任何额外高度,以使其与您的 UITableViewCell 子类中的高度相同。

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

于 2013-01-23T21:00:10.967 回答
1

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

于 2013-01-26T21:51:01.827 回答
0

在 UITextView 中的字符串上使用 NSString 的sizeWithFont:constrainedToSize:lineBreakMode :。我在返回的高度上添加了 ~15px 以给它一些喘息的空间。

于 2013-01-23T20:14:32.690 回答
0

这是一个真实世界的例子。在这个应用程序中,只有第三部分中的单个单元格被调整大小,如果您想要调整任何单元格的大小,您应该将大小(在我的示例 descriptionLableSize 中)保存在 NSMutableDictionary 中并在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;

}
于 2013-01-26T13:15:28.467 回答