【发布时间】:2014-06-03 04:07:18
【问题描述】:
在我的应用中,我使用drawViewHierarchyInRect:afterScreenUpdates: 来获得我的视图的模糊图像(使用Apple 的UIImage 类别UIImageEffects)。
我的代码如下所示:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
我注意到在开发过程中,我的许多动画在使用我的应用程序一段时间后出现延迟,也就是说,与重新启动应用程序相比,我的视图在明显(但不到一秒)暂停后开始动画.
经过一些调试,我注意到仅使用 drawViewHierarchyInRect:afterScreenUpdates: 并将屏幕更新设置为 YES 的行为导致了此延迟。如果在使用会话期间从未发送过此消息,则延迟永远不会出现。将NO 用于屏幕更新参数也使延迟消失。
奇怪的是,这个模糊代码与延迟的动画完全无关(据我所知)。有问题的动画不使用drawViewHierarchyInRect:afterScreenUpdates:,它们是CAKeyframeAnimation 动画。仅发送此消息的行为(屏幕更新设置为YES)似乎已经在我的应用中全局影响了动画。
发生了什么事?
(我创建了演示效果的视频:with 和 without 动画延迟。请注意导航栏中“检查!”对话气泡出现的延迟。)
更新
我创建了一个示例项目来说明这个潜在的错误。 https://github.com/timarnold/AnimationBugExample
第 2 条更新
我收到了 Apple 的回复,确认这是一个错误。见答案below。
【问题讨论】:
-
我遇到了类似的问题,模糊会导致 UI 更新严重滞后。我们通过确保在主线程上完成动画来解决它。这有帮助吗? - 有用的视频顺便说一句。但不确定到底要寻找什么。
-
看看“检查!”需要多长时间游戏视图控制器出现后出现的对话气泡
-
如果你使用 afterScreenUpdates:NO,它不会滞后。
标签: ios objective-c cocoa-touch core-animation