如何在iOS应用程序中使用TdBadgedCell动态管理高度单元格?

时间:2011-11-18 11:41:34

标签: ios uitableview height dynamic

我已经在我的iOS ap中实现了UITabView中的一些TdBadgedCell(来自https://github.com/tmdvs/TDBadgedCell)。但是,当我想通过使用类似这样的例子动态管理单元格的高度时:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
  NSString *text = [items objectAtIndex:[indexPath row]];

  CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

  CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

  CGFloat height = MAX(size.height, 44.0f);

  return height + (CELL_CONTENT_MARGIN * 2);
}

单元格的宽度是单元格的整个宽度(下面示例中的计算变量“约束”),而不是考虑到徽章宽度而在屏幕上打印的标签的实际宽度。因此,当文本太长时,UILabel末尾的文本部分不会出现在单元格中。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我用这部分代码解决了我自己的问题:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    MyObject *obj = [self.myObjects objectAtIndex:indexPath.row];
    NSString *textlabel = [self getMainTextStringFromMyObject:obj];
    NSString *detailtextlabel = [self getDetailTextStringFromMyObject:obj];
    CGFloat height = MAX(CELL_TEXTLABEL_HEIGHT + [self getDetailTextSizeForString:detailtextlabel].height, CELL_ROW_DEFAULTHEIGHT);

    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    MyObject *obj = [self.myObjects objectAtIndex:indexPath.row];
    NSString *textlabel = [self getMainTextStringFromMyObject:obj];
    NSString *detailtextlabel = [self getDetailTextStringFromMyObject:obj];

    static NSString *CellIdentifier = @"ImageOnRightCell";

    UILabel *mainLabel, *secondLabel;
    UIImageView *photo;
    TDBadgedCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

        mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(CELL_LABELS_MARGIN, 1.0, CELL_TEXTLABEL_WIDTH, CELL_TEXTLABEL_HEIGHT)] autorelease];
        mainLabel.tag = MAINLABEL_TAG;
        mainLabel.font = [UIFont boldSystemFontOfSize:CELL_TEXTLABEL_FONTSIZE];
        mainLabel.textColor = [UIColor blackColor];
        [cell.contentView addSubview:mainLabel];

        secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(CELL_LABELS_MARGIN, CELL_TEXTLABEL_HEIGHT, CELL_TEXTLABEL_WIDTH, 19.0)] autorelease];
        secondLabel.tag = SECONDLABEL_TAG;
        secondLabel.font = [UIFont systemFontOfSize:CELL_DETAILTEXTLABEL_FONTSIZE];
        secondLabel.textColor = [UIColor darkGrayColor];
        secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        secondLabel.numberOfLines = 0;
        secondLabel.lineBreakMode = UILineBreakModeWordWrap;
        [cell.contentView addSubview:secondLabel];

        float yOriginImg = (cell.contentView.frame.size.height/2.0);
        if((CELL_TEXTLABEL_HEIGHT + [self getDetailTextSizeForString:detailtextlabel].height) <= CELL_ROW_DEFAULTHEIGHT)
        {
            yOriginImg -= (CELL_IMGHEIGHT/2.0);
        }
        photo = [[[UIImageView alloc] initWithFrame:CGRectMake(CELL_LABELS_MARGIN+CELL_TEXTLABEL_WIDTH, yOriginImg, CELL_IMGWIDTH, CELL_IMGHEIGHT)] autorelease];
        photo.tag = PHOTO_TAG;
        [cell.contentView addSubview:photo];
    } 
    else 
    {
        mainLabel = (UILabel *)[cell.contentView viewWithTag:MAINLABEL_TAG];
        secondLabel = (UILabel *)[cell.contentView viewWithTag:SECONDLABEL_TAG];
        photo = (UIImageView *)[cell.contentView viewWithTag:PHOTO_TAG];
    }

    mainLabel.text = textlabel;
    secondLabel.text = detailtextlabel;
    cell.badgeString = [NSString stringWithFormat:@"%g",obj.duration];

    UIImage *theImage = [UIImage imageNamed:@"right_cell_icon.png"];
    photo.image = theImage;

    return cell;
}

- (NSString*) getMainTextStringFromMyObject:(MyObject*) obj
{
    return obj != nil? obj.name : nil;
}

- (NSString*) getDetailTextStringFromMyObject:(MyObject*) obj
{
    return obj.detail != nil ? obj.detail : nil;
}

- (CGSize) getDetailTextSizeForString:(NSString*) str
{
    CGSize constraint = CGSizeMake(CELL_TEXTLABEL_WIDTH - (CELL_LABELS_MARGIN * 2), 20000.0f);
    return [str sizeWithFont:[UIFont systemFontOfSize:CELL_DETAILTEXTLABEL_FONTSIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
}