Нерегулярные анимации из UITableView deleteRowsAtIndexPaths: withRowAnimation:

Резюме: В режиме редактирования я удаляю строки в представлении таблицы с помощью настраиваемого элемента управления редактирования, а не по умолчанию красный знак минус и кнопка подтверждения удаления. Отметьте строку или несколько строк, затем нажмите кнопку "Удалить" на панели инструментов. Это похоже на поведение, наблюдаемое в приложении Mail. Смотрите снимок экрана ниже.

enter image description here

Проблема: Анимации, вызванные вызовами deleteRowsAtIndexPaths:withRowAnimation:, являются нерегулярными. Например, вот что происходит, когда я использую анимацию строки Bottom (т.е. UITableViewRowAnimationBottom), чтобы удалить отмеченную строку (Subject # 7) на снимке экрана:

  • Тема # 8 слайдов внизу и сзади Тема # 7
  • Тема # 8 кратко скрыта за темой # 7
  • Тема # 8 заменяет тему # 7 jarringly

Это происходит как на симуляторе, так и на устройстве. Тип автоматической анимации (т.е. UITableViewRowAnimationAutomatic) создает такое же неправильное поведение при удалении объекта № 7 выше.

Тип анимации Top работает так, как ожидалось, в симуляторе, но создает несовместимые, резкие анимации на устройстве.

Анимация типа Fade - это единственная анимация, которая работает как ожидалось как в симуляторе, так и на устройстве.

Подробнее

Я ориентируюсь на iOS 7, используя раскадровку, чистую автоматическую компоновку и Core Data.

Здесь метод действия, в котором я удаляю строки:

- (void)deleteButtonTapped:(UIBarButton *)sender
{
    // update table view data
    [self.listOfItems removeObjectsAtIndexes:self.indexSetOfTickedRows];

    // create index paths for ticked rows
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

    [self.indexSetOfTickedRows enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        [indexPaths addObject:[NSIndexPath indexPathForRow:idx inSection:0]];
    }];

    [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationBottom];

    // update Core Data and UI...
}

Что я пробовал:

Подкласс ячейки таблицы переопределяет layoutSubviews. Однако нерегулярные анимации сохраняются, даже когда я прокомментирую layoutSubviews.

Я также удалил настраиваемый элемент управления тиканием из ячеек таблицы, а затем жестко закодировал удаление определенной строки в методе действий. Неправильная анимация сохранялась.

Как было предложено другими, я пробовал звонить deleteRowsAtIndexPaths:withRowAnimation: между вызовами beginUpdates и endUpdates. Это не решает проблему.

Любые предложения о том, что делать дальше или лучше догадываться, почему я вижу эти нерегулярные анимации?

Обновление (iOS 7.1):

Проблема остается после таргетинга на iOS 7.1. Будет продолжать полагаться на анимацию затухания.

Ответ 1

Попробуйте позвонить [self.listOfItems removeObjectsAtIndexes:self.indexSetOfTickedRows]; в конце функции, а не в начале.

Ответ 2

Попробуйте добавить [tableView beginUpdates]; и [tableView endUpdates];