核心动画立即调用完成功能

时间:2012-07-22 10:49:08

标签: ios animation core-animation objective-c-blocks icarousel

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

当我在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 个答案:

答案 0 :(得分:2)

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

根据iCarousel代码判断,这是非常有意的,所以我想我必须在我自己的代码中解决这个问题。

编辑:这是我更新的代码,可以避免此问题:

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

    // Begin animation here.

    [CATransaction setDisableActions:previousDisableActions];
}

更新:iCarousel的作者通过在每个委托调用周围内部添加我建议的代码来修复此错误。看起来这是固定好的。