CATransaction:实现页面翻转动画时的问题

时间:2011-11-26 15:14:38

标签: objective-c catransaction

我正在尝试实现翻页动画 - 当用户没有快速浏览网页时,这会动作。

我的代码如下所示:

[CATransaction begin];
[CATransaction setAnimationDuration:duration];
[CATransaction setCompletionBlock:^{
    if (pageDifference == 1 && setDelegate) {
        [self cleanupFlip];
        self.animationInProgress = NO;
    }
}];
flipAnimationLayer.transform = endTransform;
[CATransaction commit];

endTransform是一个CATransform3DIdentity,正如我所说,它可以正常工作。在我的cleanupFlip我准备下一页的屏幕截图,这使我能够执行页面翻转动画。而我所提供的屏幕截图似乎是问题所在;一旦用户点击快速浏览页面,动画就不会发生,但页面只会改变 - 没有页面翻动动画。我通过设置一个标志animationInProgress得到了改进,避免在旧的完成之前开始下一个动画。

我没有得到:我希望工作得很好,因为我在动画的最后设置animationInProgress标志,所以应该准备好一切下一次运行 - 但它不是......

在模拟器上我可以比在设备上点击更快 - 我必须等待一秒钟,直到我可以开始下一页翻页。

不进行屏幕截图(例如,仅使用空图像),一切都按预期工作。如果cleanupFlip需要一些时间,似乎问题就好了。

我是如何做到这一点的?

非常感谢!

1 个答案:

答案 0 :(得分:0)

此行为的最可能原因是用户比动画更快。也就是说,第二个[CATransaction begin]在第一个动画完成之前启动,因此在执行setCompletionBlock之前。我不确定具体的顺序是什么,但在代码中设置一些NSLog语句应该清楚。

一种解决方案可能是创建不在setCompletionBlock中的图像,而是在开始之前。或者,如果创建图像需要花费大量时间,请在提交第一个事务后立即为下一页做好准备。

在[CATransaction begin]之前放置[CATransaction flush]在这些情况下也帮助了我。