如何在不使用完成块的情况下在动画后执行代码?
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:toIndexPath
从UITableView
移动一行。
因此,当需要滚动时,这很好,两个动画花费的时间大致相同。但是当不需要滚动时,我想要在动画之后执行的代码与动画同时开始
【问题讨论】:
您是否尝试过将您的后期动画代码放入 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
之前已经调用了您的单元格移动动画的完成块。我认为它们总是相同的动画持续时间,所以你可能不需要过多地协调它们......以上是关于如何在不使用完成块的情况下在动画后执行代码?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 VBA 的情况下在 Excel 中执行反向字符串搜索?
如何在不需要自定义库的情况下在 Google Colabs 上使用 Selenium IDE,例如科拉?