Выполнение задачи (в iOS) после завершения анимации
Итак, у меня есть эта строка кода:
[tableView setContentOffset:point animated:YES];
и я хочу запустить еще один фрагмент кода после окончания анимации. Моя попытка была бросить анимационный код (setContentOffset) в отдельный метод и вызвать его, используя:
[self performSelectorOnMainThread:@selector(scrollMethod:) withObject:sender waitUntilDone:YES];
Проблема заключается в том, что метод возвращается немедленно, а не после завершения анимации, хотя waitUntilDone - это ДА, но, по-видимому, это то, как работает анимация.
Я знаю, что я могу использовать поток ожидания, но он не чист, поэтому я буду использовать его только в качестве последнего средства. (Может быть, я буду использовать это, если я знаю время, в которое требуется анимация прокрутки).
Любые идеи о том, как это сделать, приветствуются.
(PS). Сценарий таков: я показываю popover, который отлично отображается, когда нет клавиатуры, однако, если клавиатура видна, высота посева уменьшается, что иногда уменьшает ее до почти границы. показывая popover, я хочу прокрутить представление вверх так, чтобы popover никогда не появлялся на клавиатуре.)
Ответы
Ответ 1
Попробуйте использовать этот метод:
[UIView animateWithDuration:0.6f
delay:0.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^{
// Do your animations here.
}
completion:^(BOOL finished){
if (finished) {
// Do your method here after your animation.
}
}];
Ответ 2
UITableView наследует setContentOffset: анимированный: из своего суперкласса UIScrollView. Проверьте метод scrollViewDidEndScrollingAnimation: UIScrollViewDelegate.
Ответ 3
Для scrollView, tableView или collectionView, если вы выполните что-то вроде этого:
[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x+260.0,
self.collectionView.contentOffset.y)
animated:YES];
то вы вернетесь назад:
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
когда заканчивается свиток.
Вы не получите этот обратный вызов, если пользователь перемещает представление.
Ответ 4
Вы можете создавать анимации и сообщать им непосредственно, чтобы выполнить блок после их завершения.
Здесь альтернатива, которая может играть лучше с анимацией UITableView.
[UIView beginAnimations:nil context:sender];
[UIView setDelegate:self];
[UIView setDidStopSelector:@selector(scrollMethod:)];
[tableView setContentOffset:point];
[UIView commitAnimations];
И убедитесь, что вы используете scrollMethod:
с этой сигнатурой:
- (void)scrollMethod:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
Вы можете использовать контекст, чтобы узнать, какой sender
у вас есть. Подробнее о анимации UIView читайте документы UIView.