View on GitHub

Bannings的博客

[iOS developer:@"不能过目不忘,故撰文以记之"];

给UITableViewCell动态调整高度

ios   

在网上看到有人如此实现动态调整高度:点击

尴尬,不至于为了获取高度创建一个不需要的cell。

主要有两个地方需要调整高度,一个是自己创建的UILabel或其它,另一个就是cell的高度。在创建cell的地方只需要定义好label的属性就行了:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease];
        
        UILabel *contentLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        [contentLabel setLineBreakMode:UILineBreakModeWordWrap];
        [contentLabel setNumberOfLines:0];
        [contentLabel setFont:FONT_CELL];
        [contentLabel setTag:TAG_LABEL];
        
        [[cell contentView] addSubview:contentLabel];
        [contentLabel release];
    }

设置完值后再设置frame:

cell.textLabel.text = @"";
CGSize captionSize = [cell.textLabel.text sizeWithFont:FONT_CELL];
contentLabel.frame = CGRectMake(captionSize.width + 10, 0, 
                                CGRectGetWidth(cell.bounds) - captionSize.width - 10, 
                                [self tableView:nil heightForRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row inSection:0]]);
我需要让cell的高度去适应label,所以调用计算cell高度的方法,在heightForRowAtIndexPath方法中计算label所需的高度即可:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.row < …) {
        return 90;
    } else if (indexPath.row == ...) {
        NSString *caption = @"";
        CGSize contentSize = getTextSize(caption, FONT_CELL, @"data",
                                         CGRectGetWidth(self.tableView.bounds));
        return contentSize.height > 44 ? contentSize.height : 44;
    }
    return 44;
}
为了不让高度过于混乱,我把最小值设为44,getTextSize只是一个工具方法,用于计算x轴偏移的距离:

CGSize getTextSize(NSString *offsetText,UIFont *font,NSString *text, CGFloat maxWidth){
    CGSize offsetTextSize = [offsetText sizeWithFont:font];
    CGSize textSize = [text sizeWithFont:font 
     constrainedToSize:CGSizeMake(maxWidth-offsetTextSize.width, MAXFLOAT) 
         lineBreakMode:UILineBreakModeWordWrap];
    return textSize;
}
期间使用了一些公共宏,比如:FONT_CELL等等,只在cellForRowAtIndexPath里面设置好label的基本属性和frame,计算高度就交给heightForRowAtIndexPath,可以自己对返回值进行修改。