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

Ios 如何在不使用完成块的情况下在动画之后执行代码?,ios,uitableview,swift,animation,uiscrollview,Ios,Uitableview,Swift,Animation,Uiscrollview,我想在内置动画完成后执行一些代码 我有一个有很多单元格/行的UITableView。有时,当我执行一些操作时,我需要滚动到tableView的顶部。为此,我使用: tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: true) 但是一旦到达顶部,我需要执行一些代码,比如简单地选择和取消选择

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

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

tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: true)
但是一旦到达顶部,我需要执行一些代码,比如简单地选择和取消选择第一行

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

那么,一旦调用了
ScrollToRowatinePath:atScrollPosition:animated
,是否有办法执行一些代码呢

编辑:

当我谈论执行一些操作时,我谈论的是从
UITableView
使用
moverowatinexpath:toindepath
移动一行


因此,当需要滚动时,两个动画所需的时间大致相同。但是当不需要滚动时,我想在动画之后执行的代码与动画同时开始执行。你可以使用我改编的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();
}

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

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

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

您是否尝试过将后期动画代码放入ScrollViewDiEndDraging()和/或ScrollViewDiEndDecreating()中?是的,我尝试过这两种方法,但在我的案例中它们没有被调用,因为它是一种动画。您是否尝试过将后期动画代码放入ScrollViewDiEndDraging()和/或ScrollViewDiEndDecreating()中?是的,我尝试了这两种方法,但在我的案例中没有调用它们,因为它是一个动画。您是否尝试过将您的后期动画代码放入ScrollViewDiEndDraging()和/或ScrollViewDiEndDraging()?是的,我尝试了这两种方法,但在我的案例中没有调用它们,因为它是一个动画。您是否尝试过将您的后期动画代码放入ScrollViewDiEndDraging()中和/或ScrollViewDiEndDecelling()?是的,我尝试了这两种方法,但在我的案例中没有调用它们,因为这是一个动画。我编辑了问题,以添加更多关于问题标题的信息。在这种情况下,可以很好地检测到滚动的需要,但当我不必滚动时,
doThingAfterAnimation
会在动画开始移动我的行的同时启动,而我正在寻找动画完成后该行的启动。如果您也试图在同一时间移动单元格,然后,您需要使用其中一种方法为这些动画添加完成块,并确保在继续执行
doThingAfterAnimation
之前,已调用了
ScrollViewDiEndScrollingAnimation
函数和单元格移动动画的完成块。我认为它们总是相同的动画持续时间,因此您可能不需要对它们进行太多的协调…我编辑了问题,以添加更多关于我问题标题的信息。在这种情况下,可以很好地检测到滚动的需要,但当我不必滚动时,
doThingAfterAnimation
会在动画开始移动我的行的同时启动,而我正在寻找动画完成后该行的启动。如果您也试图在同一时间移动单元格,然后,您需要使用其中一种方法为这些动画添加完成块,并确保在继续执行
doThingAfterAnimation
之前,已调用了
ScrollViewDiEndScrollingAnimation
函数和单元格移动动画的完成块。我认为它们总是相同的动画持续时间,因此您可能不需要对它们进行太多的协调…我编辑了问题,以添加更多关于我问题标题的信息。在这种情况下,可以很好地检测到滚动的需要,但当我不必滚动时,
doThingAfterAnimation
会在动画开始移动我的行的同时启动,而我正在寻找动画完成后该行的启动。如果您也试图在同一时间移动单元格,然后,您需要使用其中一种方法为这些动画添加完成块,并确保在继续执行
doThingAfterAnimation
之前,已调用了
ScrollViewDiEndScrollingAnimation
函数和单元格移动动画的完成块。我认为它们总是相同的动画持续时间,因此您可能不需要对它们进行太多的协调…我编辑了问题,以添加更多关于我问题标题的信息。在这种情况下,可以很好地检测到滚动的需要,但当我不必滚动时,
doThingAfterAnimation
会在动画开始移动我的行的同时启动,而我正在寻找动画完成后该行的启动。如果您也试图在同一时间移动单元格,然后,您需要使用其中一种方法为这些动画添加完成块,并确保在继续执行
doThingAfterAnimation
之前,已调用了
ScrollViewDiEndScrollingAnimation
函数和单元格移动动画的完成块。我认为它们总是相同的动画持续时间,所以您可能不需要对它们进行太多的协调。。。