相关疑难解决方法(0)

drawViewHierarchyInRect:afterScreenUpdates:延迟其他动画

在我的应用程序中,我使用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 */
Run Code Online (Sandbox Code Playgroud)

我在开发过程中注意到,在使用我的应用程序之后,我的许多动画都被延迟了,即,与应用程序的全新启动相比,我的视图在显着(但不到大约一秒)暂停之后开始动画.

经过一些调试后,我注意到仅使用drawViewHierarchyInRect:afterScreenUpdates:屏幕更新设置YES导致此延迟.如果在使用会话期间从未发送此消息,则永远不会出现延迟.使用NO的屏幕更新参数也做出了延迟消失.

奇怪的是,这个模糊的代码延迟的动画完全无关(据我所知).有问题的动画不使用 drawViewHierarchyInRect:afterScreenUpdates:,它们是CAKeyframeAnimation动画.仅发送此消息(屏幕更新设置为YES)的行为似乎在我的应用程序中全局影响了动画.

这是怎么回事?

(我创建了说明效果的视频:没有动画延迟.请注意导航栏中"Check!"语音气泡的外观延迟.)

UPDATE

我已经创建了一个示例项目来说明这个潜在的错误.https://github.com/timarnold/AnimationBugExample

更新2号

我收到Apple的回复,证实这是一个错误.见下面的答案.

cocoa-touch core-animation objective-c ios

27
推荐指数
1
解决办法
2万
查看次数

_UIReplicantView和snapshotViewAfterScreenUpdates如何获取其内容?

-renderInContext:自从它出现以来已被广泛使用,但由于不可能渲染OpenGL层,AVPreviewLayer(可能因为是一种OpenGL层)而且我仍然无法正确渲染CATiledLayer.
随着iOS7引入了2个新的API来获取屏幕截图,一个是-snapshotViewAfterScreenUpdates:返回一个特定的视图(_UIReplicantView)而-drawViewHierarchyInRect:afterScreenUpdates:最后一个是一种替代-renderInContext,不幸的是它似乎有相同的限制.
-snapshotViewAfterScreenUpdates:它似乎也适用于OpenGL和AVPreviewLayer,不幸的是,如果你想做特定的动画或使用内容作为某些东西(如uibutton)的背景,这样的视图不是很有用.我试图从返回的视图中删除内容,但我仍然没有运气.
有人试过吗?

iphone screenshot uiview ios

24
推荐指数
1
解决办法
4358
查看次数