Как я могу сказать, когда анимация UITableView закончилась? - PullRequest
17 голосов
/ 26 августа 2011

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

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

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


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

[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.

Ответы [ 3 ]

48 голосов
/ 31 января 2013
[CATransaction begin];
[CATransaction setCompletionBlock: ^{
    // your animation has finished
}];
[tableView setEditing:YES animated:YES];
[CATransaction commit];

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

3 голосов
/ 09 февраля 2012

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

[UIView animateWithDuration:0.3f
                 animations:^{
                     [self.tableView setEditing:YES animated:NO];
                 } 
                 completion:^(BOOL finished){
                     // Do something
                 }
];
1 голос
/ 06 февраля 2018

Swift 4 версия принятого ответа:

CATransaction.begin()
CATransaction.setCompletionBlock {
    // your animation has finished
}
tableView.setEditing(true, animated: true)
CATransaction.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...