2012-02-03 91 views
5

我有一个由UIScrollView组成的自定义地图视图。滚动视图的子视图由CATiledLayer支持。这里的一切都很棒。平移&缩放会加载新的地图图块,并且所有内容都可以正常运行。拍摄UIScrollView中支持CATiledLayer的视图的图像快照

我想要做的是捕捉动画视频帧到这个滚动视图。实质上,我想创建一个动画更改视频的滚动视图的contentOffsetzoomScale

我知道这个概念很完美,因为我可以获得私人API函数UIGetScreenImage()以10fps的速度捕捉应用程序的屏幕,合并这些图像,并获得流畅的播放动画,并使用时序曲线滚动视图动画。

我的问题当然是我不能使用私有API。通过苹果here概述的替代方案,给我留下了几乎所有有效的选项:询问CALayerrenderInContext并从中取出UIGraphicsGetImageFromCurrentImageContext()

虽然这似乎不适用于CATiledLayer -backed视图。块状,未缩放的图像就是捕获的图像,就好像更高分辨率的图块永不加载。考虑到CATiledLayer在后台线程中绘制性能并从主线程调用renderInContext可能无法捕获这些更新,这有点合理。即使我也渲染平铺图层presentationLayer,结果也是类似的。

在包含滚动视图的动画过程中,是否有苹果认可的方式捕获CATiledLayer背视图的图像?或者在任何时候,对于这个问题?

+0

有人贴出答案在这里:http://stackoverflow.com/questions/5526545/render-large-catiledlayer-into-smaller-区域 – 2012-06-03 12:16:42

回答

1

顺便说一句,如果您在CATiledLayer -backed视图中正确实施renderLayer:inContext:,这是可行的。

0

我做了一个快速测试,并使用renderInContext:在包装滚动视图的视图似乎工作。你尝试过吗?

+0

是的。我已经提出了一些示例代码,它更简洁地演示了这个问题:https://github.com/incanus/TiledLayerSnapTest请注意,捕获一个普通的'UIView'可以正常工作,但是'CATiledLayer'备份的视图是空白的灰色。 – incanus 2012-02-03 07:29:04

0

此代码适用于我。

- (UIImage *)snapshotImageWithView:(CCTiledImageScrollView *)view 
{ 
// Try our best to approximate the best tile set zoom scale to use 
CGFloat tileScale; 
if (view.zoomScale >= 0.5) { 
    tileScale = 2.0; 
} 
else if (view.zoomScale >= 0.25) { 
    tileScale = 1.0; 
} 
else { 
    tileScale = 0.5; 
} 

// Calculate the context translation based on how far zoomed in or out. 
CGFloat translationX = -view.contentOffset.x; 
CGFloat translationY = -view.contentOffset.y; 
if (view.contentSize.width < CGRectGetWidth(view.bounds)) { 
    CGFloat deltaX = (CGRectGetWidth(view.bounds) - view.contentSize.width)/2.0; 
    translationX += deltaX; 
} 
if (view.contentSize.height < CGRectGetHeight(view.bounds)) { 
    CGFloat deltaY = (CGRectGetHeight(view.bounds) - view.contentSize.height)/2.0; 
    translationY += deltaY; 
} 

// Pass the tileScale to the context because that will be the scale used in drawRect by your CATiledLayer backed UIView 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(CGRectGetWidth(view.bounds)/view.zoomScale, CGRectGetHeight(view.bounds)/view.zoomScale), NO, tileScale); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context, translationX/view.zoomScale, translationY/view.zoomScale); 

// The zoomView is a subview of UIScrollView. The CATiledLayer backed UIView is a subview of the zoomView. 
[view.zoomView.layer renderInContext:context]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return image; 

}

完整的示例代码在这里找到:https://github.com/gortega56/CCCanvasView