2012-02-03 5 views
5

私はUIScrollViewで作られたカスタムマップビューを持っています。スクロールビューのサブビューには、CATiledLayerが付いています。すべてここで素晴らしい作品です。パンニング&ズームは、新しいマップタイルをロードし、すべてがうまく機能します。UIScrollViewのCATiledLayerでバックアップされたビューのイメージスナップショットを取る

私がしたいことは、アニメーションのビデオのフレームをこのスクロールビューにキャプチャすることです。基本的には、スクロールビューのcontentOffsetzoomScaleのアニメーション化された変更のビデオを作成したいと思います。

プライベートAPI関数UIGetScreenImage()を取得して、たとえば10fpsでアプリの画面をキャプチャし、これらの画像を結合し、スムーズに再生されたアニメーションを得ることができます。スクロールビューのアニメーション。

私の問題はもちろん、プライベートAPIを使用できないということです。 Apple hereで概説されている代替案を試してみると、CALayerrenderInContextと尋ねて、それからUIGraphicsGetImageFromCurrentImageContext()を取って、かなり有効なオプションを私に残します。

これはちょっとCATiledLayerのバックビューでは動作しないようです。ブロックがあり、ズームされていない画像は、高解像度のタイルがロードされないかのように、キャプチャされたものです。これは、CATiledLayerがパフォーマンスのためにバックグラウンドスレッドを描画し、メインスレッドからrenderInContextを呼び出すとこれらの更新をキャッチしない可能性があることを考えると、やや意味があります。タイルレイヤのpresentationLayerもレンダリングしても結果は同じです。

CATiledLayerバックビューの画像をAppleが許可している方法でキャプチャしているスクロールビューのアニメーション中に表示されますか?それとも、いつでも問題になっていますか?

+0

誰かがここで答えを投稿しました:http://stackoverflow.com/questions/5526545/render-large-catiledlayer-into-smaller-エリア –

答えて

1

ご参考までに、CATiledLayerのバックビューにrenderLayer:inContext:を正しく実装すると、これが可能です。

0

私は簡単なテストを行いました。そして、scrollIndexを使って、スクロールビューをラッピングするビューが動作するように見えました。あなたはそれを試しましたか?

+0

はい。私はこの問題をより簡潔に示すいくつかのサンプルコードを公開しました:https://github.com/incanus/TiledLayerSnapTest通常の 'UIView'のキャプチャはうまくいきますが、' CATiledLayer'がサポートするビューは空白になりますグレー。 – incanus

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