UITableViewRowAnimation中的scrollViewDidScroll是什么意思?

5
当使用UITableViewRowAnimation删除或添加一行时,有时如果这一行在表视图的两端,表格会滚动。
然而,即使它滚动,似乎也不会在代理中调用scrollViewDidScroll:
例如,我的代理中有以下代码。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSLog(@"Scrolling %f", scrollView.contentOffset.y);
}

如果用户滚动,将调用哪个函数。 但如果我删除一行:

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
scrollViewDidScroll:方法根本没有被调用。
有没有办法确保在UITableView动画时调用此方法?
谢谢!
2个回答

0
如果您不知道,scrollViewDidScroll仅在用户与滚动视图(或在本例中为表视图)交互时调用。它不会响应由于动画而导致的滚动而被调用。这种行为是固定的。您需要找到另一种方法来实现您想要的效果。也许这个现有的问题可能会有所帮助:

如何使UIScrollView在动画期间发送scrollViewDidScroll消息


我曾经遇到过这个问题,但是不太明白如何将deleteRowsAtIndexPaths方法中的UITableViewRowAnimationFade与块动画绑定,而不是使用内置方法。 - Arjun Mehta
4
顺便说一下,我不知道你所说的它只在用户交互时被调用的评论是否正确。如果你执行类似于[scrollView setContentOffset:aCGPoint animated:YES]; 这样的操作,scrollViewDidScroll会被触发。 - Arjun Mehta

0
你可以使用以下方法代替。
    [CATransaction setCompletionBlock: ^{
        // do stuff
    }];

    [CATransaction begin];

    [tableView beginUpdates];
    [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
    [tableView endUpdates];

    [CATransaction commit];

很不幸,但正如其名称所示,这是一个完成块。因此,它将在滚动完成后触发。而-scrollViewDidScroll:则用于捕获中间事件,例如创建视差效果。 - Julian F. Weinert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接