2013-01-23 30 views
2

我创建了UITableViewCell的子类,其中包含UITextView。当设置UITextView中的文本时,它会自动调整大小,使高度增加但宽度保持不变。如何根据其中的组件设置UITableViewCell高度

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

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

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

+0

取决于您的要求。请指定更多,然后我可以回答。 – Nirav

+0

Imho这一切都不会帮助。您需要在文本视图中控制行数属性,以便在所有情况下(例如,在编辑模式下)将其保留在单元格内。 –

回答

1

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

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

+0

谢谢你这样一个简单的解决方案。 –

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; 

} 
1

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

相关问题