代码之家  ›  专栏  ›  技术社区  ›  gcamp

当其他动画开始时,uiview动画完成块触发

  •  4
  • gcamp  · 技术社区  · 14 年前

    我在iOS上的动画中使用了块基API。

    一个动画有一个完成块,该块在动画的末尾被调用,很好。

    但是,当用户滚动(动画位于 UITableViewCell )发生这种情况时,将多次调用完成块。这个 finished 块的参数始终为 YES .

    由于动画还没有真正完成(另一个动画发生了),我认为 完成 参数应该是no,但不是。

    我错过什么了吗?如何避免多次调用完成块?

    3 回复  |  直到 13 年前
        1
  •  5
  •   Massimo Cafaro    14 年前

    完成块被多次调用,这仅仅是因为,在您的情况下,动画被多次激发。现在的情况是,IOS每次被告知都会调用动画块,可能是在一个单独的线程中。然后,对于每个动画,它跟踪其完成情况,完成后调用相关的完成块。因此,基本上,您会看到完成块多次触发,每次调用动画都会触发一个。请注意,与完成块关联的布尔值是该完成块的特定值,它不会以任何方式引用其他动画。

    简单地说,您所经历的只是并发性的影响。如果这不是您的预期行为,那么您需要相应地修改代码。如果希望一次触发一个动画,可以使用nslock(nsconditionlock用于高级控制,使用关联条件变量),或者,如果愿意,可以直接使用mutex和posix pthreads库,以互斥方式创建要执行的关键部分。

        2
  •  2
  •   runmad    14 年前

    不确定何时触发动画,以及它们是否循环(如uiactivityview微调器或其他东西)-听起来像是表视图滚动的每个像素?

    在任何情况下,也许您可以使用uiscrollview委托方法并告诉每个单元格启动动画 scrollViewWillBeginDragging: 告诉每个牢房停在 scrollViewDidEndDragging:

    你可以设置一个布尔值 isAnimating 为了你的 UITableViewCell 如果一个动画正在进行中,什么也不做。

    if (isAnimating) {
         // ... do nothing
    } else {
         // Start your animation
    }
    

    或者坚持你现在拥有的任何东西,使用一个布尔值,但只有在动画当前没有动画的情况下才启动动画。然后在你的 finished 参数刚设置 使活跃 NO

    if (isAnimating) {
             // ... do nothing
        } else {
             [UIView animateWithDuration:0.3f
                              animations:^{
                                         // animations...
                                         isAnimating = YES;
                                         }
                              completion:^{
                                         isAnimating = NO;
                                         }
              ];    
    }
    
        3
  •  0
  •   gcamp    14 年前

    我通过查看完成块在该块的开头是否相关来解决这个问题。

    这个 finished 参数现在不相关。我已经和苹果沟通过了,他们告诉我它已经在iOS 4.2中修复了。