Подтвердить что ты не робот

Выполнение задачи (в iOS) после завершения анимации

Итак, у меня есть эта строка кода:

[tableView setContentOffset:point animated:YES];

и я хочу запустить еще один фрагмент кода после окончания анимации. Моя попытка была бросить анимационный код (setContentOffset) в отдельный метод и вызвать его, используя:

[self performSelectorOnMainThread:@selector(scrollMethod:) withObject:sender waitUntilDone:YES];

Проблема заключается в том, что метод возвращается немедленно, а не после завершения анимации, хотя waitUntilDone - это ДА, но, по-видимому, это то, как работает анимация.

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

Любые идеи о том, как это сделать, приветствуются.

(PS). Сценарий таков: я показываю popover, который отлично отображается, когда нет клавиатуры, однако, если клавиатура видна, высота посева уменьшается, что иногда уменьшает ее до почти границы. показывая popover, я хочу прокрутить представление вверх так, чтобы popover никогда не появлялся на клавиатуре.)

4b9b3361

Ответ 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.