Проблема с RowAnimation - PullRequest
       28

Проблема с RowAnimation

6 голосов
/ 04 ноября 2010

Привет, ребята.у меня проблема с анимацией удаляет и вставляет в UITableView.Дело в том, что у меня разная высота ячеек, около 44,0, у 135,0 сейчас.я uitableviewstylegrouped с различными разделами.первый ряд каждого раздела является строкой группировки.при нажатии я удаляю все строки этого раздела, кроме строки группировки.но эта анимация выглядит странно, когда анимация (UITableViewRowAnimationTop) ячейки высотой 135px.я попытался установить self.tableview.cellheight равным 135 и прокомментировал tableView: cellHeightForIndexPath-Method.А анимация работает отлично.Или я устанавливаю для каждой ячейки высоту 135 в tableView: cellHeightForIndexPath-Method.

Похоже, что процесс анимации проверяет высоту первой строки в разделах и принимает эту высоту ячейки для всех последующих ячеек для анимации.

У кого-нибудь есть идея?


- (void) showhideGroup:(int)group
{   
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

    MCGroup *handleGroup = [groups objectAtIndex:group];
    NSMutableArray *groupRows = [visibleGroupData objectForKey:handleGroup.title];

    [self.tableView beginUpdates];

    if (!handleGroup.hidden) {
        int row = 0;
        for(MobileFieldMapping *field in groupRows)
        {
            if (![field.datatype matchesInsensitive:GROUPING_CELL]) 
            {
                NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group];
                [indexPaths addObject:path];
            }
            row++;
        }

        row = 0;
        for(NSIndexPath *index in indexPaths)
        {
            [groupRows removeObjectAtIndex:index.row-row];
            row++;
        }
        [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
        handleGroup.hidden=YES;
    }
    else 
    {
        NSMutableArray *allGroupRows = [groupData objectForKey:handleGroup.title];

        int row = 0;
        for (MobileFieldMapping *field in allGroupRows) 
        {
            if (![groupRows containsObject:field]) 
            {
                NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group];
                [indexPaths addObject:path];
                [groupRows insertObject:field atIndex:row];
            }
            row++;
        }

        [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
        handleGroup.hidden=NO;
    }
    [self.tableView endUpdates];


    [indexPaths release];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

    if ([cell isKindOfClass:[FormCell class]]) 
    {
        return [(FormCell*)cell height];
    }

    return 44.0;
}

Ответы [ 2 ]

2 голосов
/ 05 апреля 2012

У меня была такая же проблема.Мой обходной путь - использовать анимацию исчезающего участка:

[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];

Вместо одного для элементов:

[tableView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop];

Это выглядит намного плавнее.

0 голосов
/ 06 февраля 2012

Старый, который до сих пор остается без ответа. Я полагаю, вы поняли это давным-давно, но вот моя первая мысль. (Я помню, как пытался сделать что-то подобное сам.)

Когда UITableView вызывает heightForRowAtIndexPath:, это происходит потому, что таблица пытается подготовить ячейку, поэтому вы не можете использовать ячейку для возврата высоты. Это может вызвать бесконечную регрессию в вызовах, или это может обнаружить это и просто сдаться или выбросить исключение и оставить вас с сумкой.

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

Что касается предположения о высоте ячейки, попробуйте вызвать вставку / удаление для отдельных ячеек, а не один вызов, чтобы сделать все это сразу. UITableView по-прежнему будет группировать их для анимации после того, как вы позвоните endUpdates.

...