iOS UILabel не перерисовывается до нового размера - PullRequest
2 голосов
/ 21 августа 2011

У меня есть набор UILabel, которые отображаются в ячейках TableView.Когда пользователь касается ячейки, метка расширяется, показывая весь текст, который я там поместил, вместо усеченной версии из двух строк.

Анимация и расширение работают, но когда я снова нажимаю метку, чтобызаставить его сжать TableViewCell, метка в которой изменяет размеры правильно, но метка не делает.Я указал размер метки в NSLog, и мой программный код работает, но он не может правильно отрисовать.

Вот мой метод cellForRowAtIndexPath:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *sectionContents = [[self tableData] objectAtIndex:[indexPath section]];
    NSString *contentForRow = [sectionContents objectAtIndex:[indexPath row]];

    UILabel *label = nil;
    int noOfLines;

    UITableViewCell *cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"];
    label = [[UILabel alloc] initWithFrame:CGRectZero];

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

    label.text = contentForRow;
    if ([expandedIndexPathsArray containsObject:indexPath])
        {
        noOfLines = 0;
        CGSize size = [contentForRow sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
        label.frame = CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f));
        NSLog(@"height is now %f",label.frame.size.height);
    } else {
        noOfLines = 2;
        CGSize size = [contentForRow sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
        label.frame = CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MIN(size.height, 44.0f));
         NSLog(@"height is now %f",label.frame.size.height);
    }
    NSLog(@"Number of Lines: %d",noOfLines);
    label.lineBreakMode = UILineBreakModeWordWrap;
    label.backgroundColor = [UIColor blueColor];
    label.font = [UIFont systemFontOfSize:FONT_SIZE];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    label.numberOfLines = noOfLines;
    [[cell contentView] addSubview:label];
    [label release];
    return cell;
}

Может кто-нибудь сказать мнечто происходит здесь, потому что я изо всех сил пытаюсь понять это.

Заранее спасибо!: D

1 Ответ

1 голос
/ 21 августа 2011

Код, который вы опубликовали, не отображается (согласно вашему комментарию), чтобы наложить новые ярлыки поверх старых. Однако при каждом вызове метода он создает новую ячейку. Это не обычный шаблон дизайна.

Обычный шаблон - перерабатывать ячейки и создавать новые, только если переработанный недоступен. Используя этот подход, вам нужен (согласно вашему комментарию) какой-то способ отслеживания метки. (Один из способов сделать это показан во фрагменте ниже.)

Вы не опубликовали свой tableView: heightForRowAtIndexPath: метод. В зависимости от того, что там происходит, вы можете получить странное поведение, т. Е. Если высота строки не соответствует высоте метки. Также неясно, когда вы вызываете reloadData (или один из связанных методов) для tableView. Это нужно вызвать, чтобы iOS могла обновить высоту строки ячейки. Может быть, все в порядке в вашем коде - но определенно стоит проверить.

Я протестировал следующий код, и он расширяет и уменьшает ячейки так, как я думаю, вы пытаетесь достичь в своем вопросе. Для моего удобства этот код просто проверяет, соответствует ли строка указанному числу, чтобы определить, является ли он расширенным или нет. Вы замените [extendedIndexPathsArray containsObject: indexPath] вместо my ([indexPath row] == _pgSpecialRow).

Я отделил работу, добавив два дополнительных метода (хотя здесь меньше кода). Это частично для удобства чтения и частично потому, что tableView: heightForRowAtIndexPath: методы должны делать те же суммы, что и tableView: cellForRowAtIndexPath: method

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

    // see if there's a cell available to recylce
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell)
    {
        // there's no cell to recycle, so make a new one
        // add a label to it and tag the label so we can find it later

        cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier];
        UILabel* label = [[UILabel alloc] init];

        // do set up on label that doesn't vary with cell content
        [label setTag: 101];
        label.lineBreakMode = UILineBreakModeWordWrap;
        label.backgroundColor = [UIColor blueColor];
        label.font = [UIFont systemFontOfSize:FONT_SIZE];

        [[cell contentView] addSubview:label];
        [label release];
    }

    // either on a recycled cell or on the cell just created, set the contents

    NSArray *sectionContents = [[self tableData] objectAtIndex:[indexPath section]];
    NSString *contentForRow = [sectionContents objectAtIndex:[indexPath row]];
    UILabel* label = (UILabel*)[[cell contentView] viewWithTag:101];

    [self adjustLabel: label forText:contentForRow andExpanded:([indexPath row] == _pgSpecialRow)];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

- (void) adjustLabel: (UILabel*) label forText: (NSString*) text andExpanded: (BOOL) expanded;
{    
    label.text = text;

    CGFloat height = [self heightForLabelWithText: text expanded: expanded];
    label.frame = CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), height);

    label.numberOfLines = expanded ? 0: 2;
}


- (CGFloat) heightForLabelWithText: (NSString*) text expanded: (BOOL) expanded;
{
    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

    if (expanded)
    {
        return MAX([text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap].height, 44.0);
    }

    return MIN([text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap].height, 44.0);
}


- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *sectionContents = [[self tableData] objectAtIndex:[indexPath section]];
    NSString *contentForRow = [sectionContents objectAtIndex:[indexPath row]];

    // return a cell height that's big enough (with a bit of extra margin)
    return [self heightForLabelWithText: contentForRow expanded:([indexPath row] == _pgSpecialRow)]+ 16.0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...