Как я могу узнать, когда анимация UITableView закончена?

Как узнать, когда [UITableView setEditing: YES animated: YES] завершено?

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

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


Я отредактировал сообщение, чтобы дать контекст и некоторые обходные пути. Первоначально я устанавливалEditing и сразу перезагружал данные таблицы.

[tableView setEditing:YES animated:YES];
[tableView reloadData];

Проблема в том, что таблица перезагружается до начала анимации, и поэтому анимация никогда не будет видна.

Вот несколько способов обхода:

[tableView setEditing:YES animated:YES];
[self performSelector:@selector(ReloadTable) withObject:nil afterDelay:1.0];

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

isEditing = YES;
[tableView reloadData];
[tableView setEditing:YES animated:YES];

Это может работать, но таблица ведет себя по-разному в зависимости от того, находится ли мы в режиме редактирования. Поэтому я должен использовать свою переменную isEditing вместо стандартного UITableView.editing. Я бы предпочел не создавать новую логическую переменную isEditing.

[tableView setEditing:YES animated:YES];
[tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationTop];

Это почти хорошо работает, но в режиме редактирования первая строка должна иметь UITableViewCellEditingStyleInsert, в то время как другие строки получают UITableViewCellEditingStyleDelete. И с приведенным выше кодом стиль редактирования устанавливается перед тем, как добавляется строка. Поэтому вторая строка заканчивается UITableViewCellEditingStyleInsert.

Ответы

Ответ 1

[CATransaction begin];
[CATransaction setCompletionBlock: ^{
    // your animation has finished
}];
[tableView setEditing:YES animated:YES];
[CATransaction commit];

Обратите внимание, что setCompletionBlock должно быть сверху.

Ответ 2

В iOS 4 вы можете сделать следующее:

[UIView animateWithDuration:0.3f
                 animations:^{
                     [self.tableView setEditing:YES animated:NO];
                 } 
                 completion:^(BOOL finished){
                     // Do something
                 }
];