Как динамически управлять высотой ячейки с помощью TdBadgedCell в приложениях для iOS? - PullRequest
0 голосов
/ 18 ноября 2011

Я реализовал в своем iOS-приложении некоторую TdBadgedCell (от https://github.com/tmdvs/TDBadgedCell) в UITabView. Но когда я хочу динамически управлять высотой ячеек, используя что-то вроде этого примера:

    - (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 голосов
/ 19 ноября 2011

Я решил собственную проблему с помощью следующих частей кода:

- (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];
}
...