所以我有这行代码:
[tableView setContentOffset:point animated:YES];
我希望在动画结束后运行另一段代码。我的尝试是在一个单独的方法中抛出动画代码(setContentOffset)并使用以下方法调用它:
[self performSelectorOnMainThread:@selector(scrollMethod:) withObject:sender waitUntilDone:YES];
问题是该方法立即返回,而不是在动画结束后返回,即使waitUntilDone为YES,但显然这就是动画的工作方式。
我知道我可以使用线程等待,但它不干净,所以我只会将它作为最后的手段。 (如果我知道滚动动画发生的时间,我可能会使用它。)
欢迎任何关于如何解决这个问题的想法。
(PS场景是这样的:我正在显示一个弹出窗口,当没有键盘时它会完美显示,但是,如果键盘可见,弹出窗口的高度会缩小,有时会将其缩小到几乎只有边框。所以就在之前显示弹出窗口,我想向上滚动视图,以便弹出窗口不会弹出键盘。)
答案 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。