动画正在进行时无法与 UITableView 交互

Posted

技术标签:

【中文标题】动画正在进行时无法与 UITableView 交互【英文标题】:Can't interact with UITableView while animations are in progress 【发布时间】:2011-03-12 15:51:52 【问题描述】:

我正在尝试实现当用户点击我的一个 tableview 单元格时发生的动画。基本上,动画只是一个带有诸如“+5”或“+1”之类的文本的小标签,然后在消失的同时向上移动(基本上就像用户评分时电子游戏中出现的点一样)。

在我的控制器的tableView:didSelectRowAtIndexPath: 实现中,我正在执行以下操作(此处为简单起见):

CGRect toastFrame = /* figure out the frame from the cell frame here */;
UILabel *toast = [[UILabel alloc] initWithFrame:toastFrame];
toast.text = [NSString stringWithFormat:@"+%d", 5];
toast.backgroundColor = [UIColor clearColor];
toast.userInteractionEnabled = NO; // hoped this would work but it doesn't
[tableView addSubview:toast];

[UIView
 animateWithDuration:1.0
 animations:^
 
     toast.alpha = 0.0;
     toast.transform = CGAffineTransformMakeTranslation( 0.0, -44.0 );
 
 completion:^ (BOOL finished)
 
     [toast removeFromSuperview];
 ];

[toast release];

吐司看起来很漂亮,看起来很棒。问题是在动画完成之前,tableview 会停止接收触摸事件。这意味着在点击表格视图中的一个单元格后的一秒钟内,您不能点击表格视图中的任何其他单元格。

有没有办法阻止这种情况发生并允许用户继续与 tableview 交互,就好像动画根本没有发生一样?

在此先感谢您提供任何帮助。

【问题讨论】:

【参考方案1】:

另一种选择可能是使用animateWithDuration:delay:options:animations:completion:(未经测试,从我的头顶)

查看options 参数和UIViewAnimationOptions 定义的可能标志。其中包括一个名为UIViewAnimationOptionAllowUserInteraction 的标志。这可能是一个解决方案,也许你应该尝试一下!

【讨论】:

太棒了!做到了。以块方式执行此操作的好处是,块会自动保留来自外部的视图,因此您无需担心在调用完成处理程序之前手动确保临时视图不会被破坏。也给你以官方推荐的方式做这件事的令人怀疑的满足感:) 五年后,你仍然拯救了我。谢谢!【参考方案2】:

你试过换一种方式吗?例如,将 toast 添加为子视图后,您可以执行以下操作:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve: UIViewAnimationCurveEaseOut];
[UIView setAnimationDuration: 1.0];
toast.alpha = 0.0;
toast.frame.origin.y -= 44.0;
[toast performSelector:@selector(removeFromSuperview) withObject: nil afterDelay: 1.0];
[UIView commitAnimations];

然后释放吐司。你可以试试这个方法,看看是否有效。

【讨论】:

嗨 - 非常感谢这个,这确实有效并且给了我想要的行为。我想知道为什么块动画方法不起作用,因为这是现在推荐的做事方式。 真的,现在是推荐的方式吗?我能想到为什么它不能与 block 方法一起工作的唯一原因是 block 方法不会创建一个新线程,而这个方法会创建一个新线程并且所有工作都在另一个线程中完成。也许他们将其设置为默认行为以节省资源,因为大多数人不需要在动画期间启用交互,而对于少数人来说,您可以使用此方法。只是我的猜测。 根据[UIView beginAnimations:context:] 的文档,不再推荐这种方式(假设您的应用程序至少需要 ios 4.0):developer.apple.com/library/ios/#documentation/uikit/reference/… 啊,我明白了。很高兴知道。谢谢(你的)信息。我不知道。

以上是关于动画正在进行时无法与 UITableView 交互的主要内容,如果未能解决你的问题,请参考以下文章

XCUITest:与具有许多单元格的表格进行交互

具有实时数据的 UITableView 也同时具有用户交互

无法扩展 UITableView

等待用户完成与 UITableView 的交互

UITableView 删除动画无法正常工作

在 UIView 动画期间难以允许用户交互