Как поймать конец анимации в deleteRowsAtIndexPaths

Мне было интересно, есть ли какая-нибудь возможность поймать, если анимация, запущенная во время удаленияResRasAtIndexPaths, закончилась? Я пытаюсь удалить несколько строк из UITableView, кроме одного, который я использовал. Затем я хочу вставить несколько строк в один и тот же UITableView. Обе операции выполняются при разделении блоков beginUpadate/endUpdate. Проблема в том, что перед удалением конца анимации начинается анимация вставки, и я хочу, чтобы она запускалась одна за другой, потому что вставленные строки поступают из внешнего веб-сервиса.

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

Заранее благодарим за помощь!

Ответ 1

Я считаю, что обработка обновления таблицы в animateWithDuration будет работать:

[UIView animateWithDuration:0.0 animations:^{
    [coursesTable beginUpdates];
    …
    [coursesTable endUpdates];
} completion:^(BOOL finished) {
    // Code to run when table updates are complete.
}];

Другие методы, которые я нашел здесь, на Stack Overflow, не работали для меня.

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

Ответ 2

используйте CATransaction, чтобы поймать завершение анимации

CATransaction.begin()
CATransaction.setCompletionBlock({
     // completion
})
// do your animation here
CATransaction.commit()

Ответ 3

От iOS 11 и выше:

[tblProducts performBatchUpdates:^{
        [self->tblProducts deleteRowsAtIndexPaths:@[self.animDeleteIndex] withRowAnimation:UITableViewRowAnimationFade];
    } completion:^(BOOL finished) {
        [self->tblProducts reloadData];
}];