动画完成后执行任务(在 iOS 中)
Posted
技术标签:
【中文标题】动画完成后执行任务(在 iOS 中)【英文标题】:Perform a task (in iOS) after animation has finished 【发布时间】:2011-11-25 09:44:56 【问题描述】:所以我有这行代码:
[tableView setContentOffset:point animated:YES];
我想在动画结束后运行另一段代码。我的尝试是将动画代码(setContentOffset)放在一个单独的方法中并使用以下方法调用它:
[self performSelectorOnMainThread:@selector(scrollMethod:) withObject:sender waitUntilDone:YES];
问题是该方法立即返回,而不是在动画完成后返回,即使 waitUntilDone 为 YES,但显然动画就是这样工作的。
我知道我可以使用线程等待但它并不干净,所以我只会将它作为最后的手段。 (如果我知道滚动动画发生所需的时间,也许我会使用它。)
欢迎任何关于如何解决此问题的想法。
(P.S. 场景是这样的:我正在展示一个弹出框,它在没有键盘时完美显示,但是,如果键盘可见,弹出框的高度会缩小,有时会缩小到几乎只有边框。所以就在之前显示弹出框,我想向上滚动视图,以便弹出框永远不会在键盘中弹出。)
【问题讨论】:
【参考方案1】:UITableView 从它的超类 UIScrollView 继承 setContentOffset:animated:。查看 UIScrollViewDelegate 的 scrollViewDidEndScrollingAnimation: 方法。
【讨论】:
+1 用于实际阅读问题并给出唯一正确答案。 谢谢抢。 +1 这个简单的方法。【参考方案2】:尝试使用这种方法:
[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.
];
【讨论】:
会回答同样的问题...我想知道这是否会干扰 tableView 动画。 那么我的新答案对于教育目的仍然有用:) 感谢 Kjuly 的回答。这对我来说很好,因为我希望 popoverDisplayMethod 仅在一个特定实例上执行。这给了我做这件事的能力和灵活性。【参考方案3】:对于滚动视图、表格视图或集合视图,如果您执行以下操作:
[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 docs 了解更多关于 UIView 动画的信息。
【讨论】:
@Till 在我开始回答后它改变了,所以没有。另外,如果您要对此嗤之以鼻,当问题询问您的想法时(您是否阅读了整个问题?),没有正确答案;) 该问题已在 27 分钟前提出。您在 10 分钟前回答了问题,并且该问题尚未被编辑。不确定您的屏幕发生了什么变化。 @Till 显然,如果您编辑问题的速度足够快,它不会显示为已编辑(可能是为了让提问者有时间快速纠正小错误而不会弄乱网站)。我知道这一点,因为我自己的问题也没有说明编辑时间。无论如何,在这些类型的网站上,刻薄并不是一个好主意。 嗨 @Till 它确实改变了,奇怪的是为什么没有编辑版本。 :? 好吧,在这种情况下,我需要道歉并收回一切。以上是关于动画完成后执行任务(在 iOS 中)的主要内容,如果未能解决你的问题,请参考以下文章