борется с форматированием динамической высоты строки в UITableView - PullRequest
2 голосов
/ 07 мая 2011

Я пытаюсь изменить высоту строки в UITableView на основе длины текста.У меня есть следующий код:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText =[[topics objectAtIndex:indexPath.row] name];
    UIFont *cellFont = [UIFont fontWithName:@"ArialMT" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:17.0];
    }
}

Тем не менее, он портится с UIImageView и UIDetailText, изображение показано ниже:

enter image description here

Как исправитьэто?

Я пробовал:

[cell.imageView setContentMode:UIViewContentModeScaleToFill];
    [cell.imageView setFrame:CGRectMake(0, 0, 16,16)];
    [cell.imageView setBounds:CGRectMake(0, 0, 16,16)];
    [cell.imageView setAutoresizingMask:UIViewAutoresizingNone];
    [cell.imageView setAutoresizesSubviews:NO];

и, похоже, никто не работает

Ответы [ 3 ]

2 голосов
/ 07 мая 2011

Работа по изменению фреймов подпредставлений ячейки выполняется в - (void)layoutSubviews класса UITableViewCell, поэтому, если вы хотите изменить это поведение, вы можете создать подкласс общего UITableViewCell и затем выполнить что-то вроде:

@implementation MyTableViewCell

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.frame = CGRectMake( -- your own size -- );
}

@end
1 голос
/ 07 мая 2011

Вместо создания подклассов, как предлагают другие, вы также можете добавить свои собственные подпредставления в представление содержимого ячейки.

С Настройка ячеек :

Если вы хотите, чтобы ячейка имела разные компоненты контента и иметь эти выложены в разных местах, или если Вы хотите другой поведенческий характеристики для клетки, у вас есть две альтернативы. Вы можете добавить подпредставления к свойству contentView объекта объект ячейки или вы можете создать собственный подкласс UITableViewCell.

  • Вы должны добавлять подпредставления в представление содержимого ячейки, когда макет содержимого можно полностью указать с соответствующими настройками автоматического изменения размера и когда вам не нужно изменять поведение ячейки по умолчанию.
  • Вам следует создать собственный подкласс, когда для вашего содержимого требуется пользовательский код макета или когда вам нужно изменить поведение ячейки по умолчанию, например, в ответ на режим редактирования.

См. Этот пример:

#define CUSTOM_IMAGE_TAG 99
#define MAIN_LABEL 98

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UIImageView *customImageView = nil;
    UILabel *mainLabel = nil;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        customImageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 40.0f, 40.0f)] autorelease];
        customImageView.tag = CUSTOM_IMAGE_TAG;
        [cell.contentView addSubview:customImageView];

        mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(60.0f, 10.0f, 100.0f, 21.0f)] autorelease];
        mainLabel.tag = MAIN_LABEL;
        mainLabel.numberOfLines = 0;
        [cell.contentView addSubview:mainLabel];
    } else {
        customImageView = (UIImageView *)[cell.contentView viewWithTag:CUSTOM_IMAGE_TAG];
        mainLabel = (UILabel *)[cell.contentView viewWithTag:MAIN_LABEL];
    }

    // Configure the cell.
    CGRect frame = mainLabel.frame;
    frame.size.height = ... // dynamic height
    mainLabel.frame = frame;

    return cell;
}

Очевидно, вам все еще нужно реализовать tableView:heightForRowAtIndexPath:.

0 голосов
/ 07 мая 2011

Я думаю, что встроенный imageView будет игнорировать ваши попытки изменить его размер.Подкласс UITableViewCell и добавьте свой собственный UIImageView к нему.Затем вы можете контролировать все аспекты вашего изображения.

- решение wisenomad будет работать без добавления собственного пользовательского изображения и меток.-

Вам также придется изменить рамку текстовой метки.Вот пример.

- (void)layoutSubviews {
        [super layoutSubviews];
        float sideLength = self.frame.size.height;
        self.imageView.frame = CGRectMake(0.0, 0.0, sideLength, sideLength);
        CGRect textLabelFrame = self.textLabel.frame;
        self.textLabel.frame = CGRectMake(44.0, textLabelFrame.origin.y, textLabelFrame.size.width - 44.0 + textLabelFrame.origin.x, textLabelFrame.size.height);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...