I've got a custom map view which is made of a UIScrollView
. The scroll view's subview is backed by a CATiledLayer
. Everything works great here. Panning & zooming loads up new map tiles and everything performs well.
What I want to do is capture frames of video of animations to this scroll view. Essentially, I want to create a video of animated changes to the scroll view's contentOffset
and zoomScale
.
I know that the concept is sound as I can get the private API function UIGetScreenImage()
to capture the app's screen at, say, 10fps, combine these images, and I get playback animations that are smooth and have the timing curves used by the scroll view animations.
My problem, of course, is that I can't use the private API. Going through the alternatives outlined by Apple here leaves me with pretty much one supposedly valid option: asking a CALayer
to renderInContext
and taking a UIGraphicsGetImageFromCurrentImageContext()
from that.
This just doesn't seem to work with CATiledLayer
-backed views, though. A blocky, un-zoomed image is what is captured, as if the higher-resolution tiles never load. This somewhat makes sense given that CATiledLayer
draws in background threads for performance and calling renderInContext
from the main thread might not catch these updates. The result is similar even if I render the tiled layer's presentationLayer
as well.
Is there an Apple-sanctioned way of capturing an image of a CATiledLayer
-backed view during the course of the containing scroll view's animations? Or at any point, for that matter?
BTW, this is doable if you properly implement
renderLayer:inContext:
in yourCATiledLayer
-backed view.