中断UITableView单元格的调整动画?

6

我有一个UITableView,在它停止滚动时(scrollViewDidEndDecelerating:),通过设置变量currentRow并重新加载数据,当前单元格的高度会扩展:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    CGFloat current_offset = self.tableView.contentOffset.y;
    currentRow = [self.tableView indexPathForRowAtPoint:CGPointMake(0, current_offset)].row;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
};

动画效果很好,但它暂时阻止了表格视图的滚动/交互。因此,如果我在单元格展开时触摸屏幕,除非再试一次,否则我将无法滚动。
是否有其他方法来实现相同的效果?

也许你可以尝试在动画开始之前禁用 userInteractionEnabled(或其他类似的属性),并在动画结束后启用它。 - Dino Tw
也许启用了delaysContentTouches?我曾经遇到过这个问题,即使禁用delaysContentTouches也似乎无法解决它。 - brandonscript
很遗憾,无法中断UITableView的动画。请务必向苹果提交错误报告以请求此功能;在赏金到期之前不要忘记标记一个答案为已接受。 - memmons
为什么不尝试使用 commit reloadData 代替 beginUpdates 和 endUpdates 呢?另外,您也可以尝试使用 commit Animations。 - Daniel
5个回答

4
您可以使用这种方法停止动画,但我不确定它是否会引起问题。
- (void)stopAnimations
{
    for (UITableViewCell *cell in [self.tableView visibleCells]) {
        [cell.layer removeAllAnimations];
    }
}

尝试在TableViewController上添加以下内容。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self stopAnimations];
}
或者尝试向应用程序窗口添加轻击手势,然后在手势触发时调用stopAnimations。

也不会有帮助。动画已经在进行中了。如果在动画期间忽略触摸事件,你如何基于UITableView的触摸调用停止呢? - memmons
我确信tableView动画不会挂起主线程,我认为可能会调用touchesBegan:withEvent:并终止动画。 - l0gg3r
1
请随意尝试以实现 OP 所要求的内容。你不仅需要停止动画,还需要将用户尝试并被拦截的滚动动作应用于 UITableView。这将非常脆弱和 hacky。 - memmons
@MichaelG.Emmons 为什么你在做减法? - l0gg3r
@logger 不确定你在问什么。 - memmons
显示剩余3条评论

1
尝试这个:

[CATransaction begin];

[self.tableView beginUpdates];


[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
   CGFloat current_offset = self.tableView.contentOffset.y;
   currentRow = [self.tableView indexPathForRowAtPoint:CGPointMake(0, current_offset)].row;
}];


[self.tableView endUpdates];

[CATransaction commit];

最后,您可能还想为tableview添加动画。

这个可能很好用,但在我授予赏金之前,我想看到 OP 验证。 - brandonscript
混淆了——OP并没有要求插入新行,而是在滚动停止后扩展现有行。假设您修改代码以执行OP要求的操作,将表更新放在事务中仍然无法使扩展行动画可中断。 - memmons
@MichaelG.Emmons 是正确的。我不确定是否有解决方案。我已经决定采用不同的设计,只是在相邻单元格上叠加信息,而不是尝试扩展单元格。 - Michael Wilson

1
UITableView的动画系统是完全不透明的。没有API可以让您修改或覆盖除选择插入/删除类型的动画之外发生的任何事情。查看标头文件并查看堆栈跟踪。
因此,没有实际方法可以防止UITableView动画阻塞触摸,也不应该这样做。这样做可能导致操作已出队列的单元格。因此,除非您喜欢EXC_BAD_ACCESS错误,请勿这样做。
请注意,对于所有UITableView动画,用户交互都被禁用,而不仅仅是更新 - 插入、删除和重新加载以相同的方式处理。
这似乎是一个合理的钩子进入UITableView动画,因此,请确保向Apple提交 错误报告,也许我们将在未来的增强版中看到它。

1
这一切都很好,但应该有可能中断表视图上的动画,类似于UIAnimationOptionsAllowUserInteraction。 - brandonscript
一些支持“不是这样”的参考资料将会很有帮助 - 不应该完全相信一个单独的评论。 - brandonscript
1
@remus UITableView的动画系统是完全不透明的。没有API可以让您修改或覆盖除选择插入/删除类型的动画发生之外的任何操作。浏览头文件并查看堆栈跟踪。 - memmons

1

如果您正在使用iOS 7+,您可以尝试在[UIView performWithoutAnimation:]块内调用表格更新。


所有这样做的只是确保行高立即转换。并没有真正解决问题。 - memmons

1

无法中断tableview动画,而且也不建议这样做。如果您希望tableview在第一次触摸时响应,则可以使用 reloadData 方法而不是 beginUpdates ,否则尝试使用 reloadSection 方法。这可能有所帮助,但防止动画并不是一个好主意。


你能详细说明一下这如何有助于提高响应能力,可以举个例子吗? - brandonscript

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