Выполнить задачу (в iOS) после завершения анимации - PullRequest
13 голосов
/ 25 ноября 2011

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

[tableView setContentOffset:point animated:YES];

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

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

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

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

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

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

Ответы [ 4 ]

35 голосов
/ 25 ноября 2011

UITableView наследует setContentOffset: animated: от своего суперкласса, UIScrollView.Проверьте scrollViewDidEndScrollingAnimation: метод UIScrollViewDelegate.

24 голосов
/ 25 ноября 2011

Попробуйте использовать этот метод:

[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.
                     }
                 }];
1 голос
/ 04 ноября 2014

Для scrollView, tableView или collectionView, если вы делаете что-то вроде этого:

[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x+260.0,
                                                      self.collectionView.contentOffset.y)
                                 animated:YES];

тогда вы получите обратно:

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

когда закончится прокрутка.

Вы НЕ получите этот обратный вызов, если пользователь перемещает представление.

0 голосов
/ 25 ноября 2011

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

Вот альтернатива, которая может сыграть лучше с анимациями 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...