如何在不使用完成块的情况下在动画后执行代码?

Posted

技术标签:

【中文标题】如何在不使用完成块的情况下在动画后执行代码?【英文标题】:How to execute code after an animation without using the completion block? 【发布时间】:2015-04-04 03:39:33 【问题描述】:

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

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

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

但是一旦到达顶部,我需要执行一些代码,例如第一行的简单选择和取消选择。

我从UIScrollViewDelegate 实现了func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView)。它工作正常(或多或少,有时动画不是很流畅,我们看不到选择/取消选择“动画”),除非我已经在 tableView 的顶部,然后 scrollViewDidEndScrollingAnimation 不被调用.

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

编辑:

当我谈论做一些操作时,我谈论的是使用moveRowAtIndexPath:toIndexPathUITableView 移动一行。

因此,当需要滚动时,这很好,两个动画花费的时间大致相同。但是当不需要滚动时,我想要在动画之后执行的代码与动画同时开始

【问题讨论】:

您是否尝试过将您的后期动画代码放入 scrollViewDidEndDragging() 和/或 scrollViewDidEndDecelerating() 中? 是的,我都试过了,在我的情况下它们没有被称为动画 【参考方案1】:

您可以使用我改编自 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();

【讨论】:

我编辑了问题以添加更多信息,这对我的问题标题更有意义。在这种情况下,可以很好地检测到滚动的需要,但是当我不必滚动时,doThingAfterAnimation 会在动画移动我的行的同时开始,而我正在寻找它在动画完成后开始. 如果您试图同时移动单元格,那么您需要使用here 方法之一为这些动画添加一个完成块,并确保scrollViewDidEndScrollingAnimation func 在继续doThingAfterAnimation 之前已经调用了您的单元格移动动画的完成块。我认为它们总是相同的动画持续时间,所以你可能不需要过多地协调它们......

以上是关于如何在不使用完成块的情况下在动画后执行代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用对话框的情况下在操作栏上方显示视图?

如何在不使用睡眠的情况下在 C# 中执行短暂的延迟?

如何在不使用 VBA 的情况下在 Excel 中执行反向字符串搜索?

如何在不需要自定义库的情况下在 Google Colabs 上使用 Selenium IDE,例如科拉?

如何在不脱离控制台的情况下在 Windows 中的 Python 中执行 os.execv()?

如何在不重新加载 visibleCell 的情况下在 collectionView 上重新加载数据