核心动画立即调用完成函数

Posted

技术标签:

【中文标题】核心动画立即调用完成函数【英文标题】:Core animation calling completion function immediately 【发布时间】:2012-07-22 10:49:07 【问题描述】:

我正在尝试使用通常的 UIView 类方法为一些东西制作动画。我在流行的iCarousel 库调用的方法中调用这些动画方法。当我滚动轮播时,动画立即进入完成状态并调用完成函数(忽略动画的持续时间)。 finished BOOL 为真,因此看起来动画没有被中断。

当我在 iCarousel 的委托方法之外触发这些动画时,它们会起作用。我不打算修复 iCarousel,也不认为它有什么问题。我更好奇里面的代码可能会导致我的动画立即完成。以及我可以做些什么来避免这个问题。

这是一个例子:

- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel 
    [UIView
     animateWithDuration:5.0f
     delay:0
     options:
        UIViewAnimationOptionCurveEaseOut |
        UIViewAnimationOptionOverrideInheritedDuration |
        UIViewAnimationOptionOverrideInheritedCurve
     animations:^
        myView.alpha = 0;
     
     completion:^(BOOL finished)
         NSLog(@"Completed. Did it finish? %i", finished);
     ];

最后一个细节: iCarousel 的文档中提到,您可以更改轮播的 useDisplayLink 属性,以避免与动画发生一些冲突。这似乎没有任何区别。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

我在 iCarousel 的源头深处发现了问题。出于某种原因,在他们的库中,他们使用[CATransaction setDisableActions:YES]; 禁用动画,然后稍后在许多不同的地方重新启用它。一个这样的地方跨越了一堆回调,这阻止了我的动画正常触发。

从 iCarousel 代码来看,这是故意的,所以我想我必须在自己的代码中解决这个问题。

编辑:这是避免此问题的更新代码:

- (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel 
    BOOL previousDisableActions = [CATransaction disableActions];
    [CATransaction setDisableActions:NO];

    // Begin animation here.

    [CATransaction setDisableActions:previousDisableActions];

更新: iCarousel 的作者已通过在每个委托调用周围添加我上面建议的代码来修复此错误。看起来这个问题已经解决了。

【讨论】:

以上是关于核心动画立即调用完成函数的主要内容,如果未能解决你的问题,请参考以下文章

将动画添加到子视图时立即调用 CATransaction 完成块

Flutter 实战动画核心

核心动画 - 未调用 animationDidStop

iOS核心动画Core Animation

立即调用 Pan Gesture 完成处理程序

(一二一)核心动画基础