1

我正在尝试实现一个翻页动画——当用户浏览页面的速度不是太快时,它会起作用。

我的代码如下所示:

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

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

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

在模拟器上我可以比在设备上更快地点击——在那里我必须等待一秒钟才能开始下一页。

如果不制作屏幕截图(例如,仅使用空图像),一切都会按预期工作。cleanupFlip如果需要一些时间,这似乎是个问题。

有什么想法可以让我完成这项工作吗?

非常感谢!

4

1 回答 1

0

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

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

在 [CATransaction begin] 之前放置 [CATransaction flush] 在这些类型的情况下也对我有所帮助。

于 2012-02-14T19:37:38.047 回答