0

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

当我在 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 属性,以避免与动画发生一些冲突。这似乎没有任何区别。

提前感谢您的帮助!

4

1 回答 1

2

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

从 iCarousel 代码来看,这是非常有意的,所以我认为我必须在自己的代码中解决这个问题。

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

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

    // Begin animation here.

    [CATransaction setDisableActions:previousDisableActions];
}

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

于 2012-07-22T19:01:08.873 回答