insertRowsAtIndexPaths :with scrollToRowAtIndexPath :приводит к неправильному скрытию разделов UITableView

Я создал UITableview с разделами, которые можно щелкнуть. Когда вы нажимаете на них,

  1. они «расширяются», обнажая внутри себя клетки
  2. выбранный раздел прокручивается в верхнюю часть представления.

Я рассчитываю все индексные пути для вставки/удаления необходимых ячеек, а затем вставляю их с помощью следующего кода:

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:pathsToOpen withRowAnimation:insertAnimation];
[self.tableView deleteRowsAtIndexPaths:pathsToClose withRowAnimation:deleteAnimation];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:[pathsToOpen objectAtIndex:0]  atScrollPosition:UITableViewScrollPositionTop animated:YES];

Есть только одна проблема -разделы ниже выбранного раздела скрыты. На первом снимке экрана -показано, как должно выглядеть табличное представление. На втором снимке экрана -показано, как это выглядит на самом деле.

Sections Disappear

Если вы прокрутите вверх (, чтобы скрытые разделы оказались за пределами экрана ), а затем прокрутите обратно вниз, скрытые разделы снова станут (видимыми ). Я предполагаю, почему это происходит, следующее:

Анимация вставки/удаления происходит одновременно с scrollToRowAtIndexPath, и это сбивает с толку TableView. Если бы я не сделал scrollToRowAtIndexPath, разделы 3 и 4 были бы за кадром -, и поэтому tableView почему-то все еще думает, что они за кадром. UITableview скрывает ячейки/разделы, которые находятся за пределами экрана, в качестве оптимизации. Если я вызываю scrollToRowAtIndexPathс помощью dispatch_afterс 2 секундами, то разделы 3 и 4 отображаются правильно.

Поэтому я думаю, что знаю, почему это происходит, но я не знаю, как исправить/переопределить эту оптимизацию UITableview. На самом деле, если я реализую scrollViewDidEndScrollingAnimation, а затем добавлю точку останова в эту функцию, приложение правильно отображает разделы 3 и 4 (, вот как я получил первый снимок экрана -). Но, продолжая выполнять эту функцию, клетки исчезают.

Полный проект можно скачать здесь


Дополнительные сведения о реализации :Разделы являются допустимыми разделами UITableView. Я добавил tapGestureRecognizer, который запускает обратный вызов делегата для представления таблицы. Ниже приведен весь метод, открывающий разделы.

- (void)sectionHeaderView:(SectionHeaderView *)sectionHeaderView sectionOpened:(NSInteger)sectionOpened
{
    // Open
    sectionHeaderView.numRows = DefaultNumRows;
    sectionHeaderView.selected = YES;
    NSMutableArray *pathsToOpen = [[NSMutableArray alloc] init];
    for (int i = 0; i < sectionHeaderView.numRows; i++)
    {
        NSIndexPath *pathToOpen = [NSIndexPath indexPathForRow:i inSection:sectionOpened];
        [pathsToOpen addObject:pathToOpen];
    }

    // Close
    NSMutableArray *pathsToClose = [[NSMutableArray alloc] init];
    if (openSectionHeader)
    {
        for (int i = 0; i < openSectionHeader.numRows; i++)
        {
            NSIndexPath *pathToClose = [NSIndexPath indexPathForRow:i inSection:openSectionHeader.section];
            [pathsToClose addObject:pathToClose];
        }
    }

    // Set Correct Animation if section's already open
    UITableViewRowAnimation insertAnimation = UITableViewRowAnimationBottom;
    UITableViewRowAnimation deleteAnimation = UITableViewRowAnimationTop;
    if (!openSectionHeader || sectionOpened < openSectionHeader.section)
    {
        insertAnimation = UITableViewRowAnimationTop;
        deleteAnimation = UITableViewRowAnimationBottom;
    }

    openSectionHeader.numRows = 0;
    openSectionHeader.selected = NO;
    openSectionHeader = sectionHeaderView;


    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:pathsToOpen withRowAnimation:insertAnimation];
    [self.tableView deleteRowsAtIndexPaths:pathsToClose withRowAnimation:deleteAnimation];
    [self.tableView endUpdates];
    [self.tableView scrollToRowAtIndexPath:[pathsToOpen objectAtIndex:0]  atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

5
задан bearMountain 19 July 2012 в 16:32
поделиться