如何在动画后执行代码而不使用完成块?

时间:2015-04-04 03:39:34

标签: ios uitableview swift animation uiscrollview

我想在内置动画完成后执行一些代码。

我有一个带有很多单元格/行的UITableView。有时候,当我做一些操作然后我需要滚动到tableView的顶部。为此,我使用:

tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: true)

但是我需要在达到顶部后执行一些代码,这样一个简单的选择和取消选择第一行。

我从func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView)实施了UIScrollViewDelegate。它工作正常(或多或少,有时动画并不是非常流畅,我们不会看到选择/取消选择"动画")除非我已经在表格的顶部,然后scrollViewDidEndScrollingAnimation没有被召唤。

有没有办法在调用scrollToRowAtIndexPath:atScrollPosition:animated后执行一些代码?

修改

当我谈论进行某些操作时,我正在谈论使用moveRowAtIndexPath:toIndexPath中的UITableView移动行。

因此,当需要滚动它很好时,两个动画需要大约相同的时间。但是当不需要滚动时,那么我想在动画之后执行的代码的执行与动画同时启动

1 个答案:

答案 0 :(得分:2)

您可以使用我从an old Objective-C answer改编的Swift代码来滚动视图。

// First, test whether the tableView needs to scroll to the new position
var originalOffset = tableView.contentOffset.y;
tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)

var offset = tableView.contentOffset.y;

if (originalOffset == offset) {
    // No animation is needed since its already there
    doThingAfterAnimation();
} else {
    // We know it will scroll to a new position
    // Return to originalOffset. animated:NO is important
    tableView.setContentOffset(CGPointMake(0, originalOffset), animated: false);
    // Do the scroll with animation so `scrollViewDidEndScrollingAnimation:` will execute
    tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: true)
}

然后当然:

func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
    doThingAfterAnimation();
}