动画完成后执行任务(在iOS中)

时间:2011-11-25 09:44:56

标签: ios objective-c ipad animation

所以我有这行代码:

[tableView setContentOffset:point animated:YES];

我希望在动画结束后运行另一段代码。我的尝试是在一个单独的方法中抛出动画代码(setContentOffset)并使用以下方法调用它:

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

问题是该方法立即返回,而不是在动画结束后返回,即使waitUntilDone为YES,但显然这就是动画的工作方式。

我知道我可以使用线程等待,但它不干净,所以我只会将它作为最后的手段。 (如果我知道滚动动画发生的时间,我可能会使用它。)

欢迎任何关于如何解决这个问题的想法。

(PS场景是这样的:我正在显示一个弹出窗口,当没有键盘时它会完美显示,但是,如果键盘可见,弹出窗口的高度会缩小,有时会将其缩小到几乎只有边框。所以就在之前显示弹出窗口,我想向上滚动视图,以便弹出窗口不会弹出键盘。)

4 个答案:

答案 0 :(得分:35)

UITableView从其超类UIScrollView继承setContentOffset:animated :.查看UIScrollViewDelegate的scrollViewDidEndScrollingAnimation:方法。

答案 1 :(得分:24)

尝试使用此方法:

[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 :(得分:1)

对于scrollView,tableView或collectionView,如果你这样做:

[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x+260.0,
                                                      self.collectionView.contentOffset.y)
                                 animated:YES];
然后你会得到一个:

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
滚动完成时

如果用户移动视图,则不会收到此回调。

答案 3 :(得分:0)

您可以创建动画,并在完成后直接告诉他们执行阻止。

这是一个可以在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 docs