【问题标题】:Can't interact with UITableView while animations are in progress动画正在进行时无法与 UITableView 交互
【发布时间】: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 交互,就好像动画根本没有发生一样?

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

【问题讨论】:

    标签: iphone animation uitableview


    【解决方案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/…
    • 啊,我明白了。很高兴知道。谢谢(你的)信息。我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多