5

で作られたカスタムマップビューがありUIScrollViewます。スクロールビューのサブビューは。で裏打ちされていCATiledLayerます。ここではすべてがうまく機能します。パンとズームは新しいマップタイルをロードし、すべてがうまく機能します。

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

プライベートAPI関数UIGetScreenImage()を取得してアプリの画面をたとえば10fpsでキャプチャし、これらの画像を組み合わせて、スクロールビューアニメーションで使用されるタイミングカーブを備えたスムーズな再生アニメーションを取得できるため、コンセプトは適切であることがわかります。

もちろん、私の問題は、プライベートAPIを使用できないことです。ここでAppleが概説した代替案を検討するCALayerと、おそらく有効な選択肢が1つ残っていrenderInContextますUIGraphicsGetImageFromCurrentImageContext()

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

CATiledLayerスクロールビューのアニメーションを含む過程で、Appleが認可したバックビューの画像をキャプチャする方法はありますか?またはいつでも、そのことについては?

4

3 に答える 3

1

renderLayer:inContext:ところで、これは、バックビューで適切に実装すれば実行可能ですCATiledLayer

于 2013-05-06T18:06:19.403 に答える
0

簡単なテストを行い、renderInContextを使用しました。スクロールビューをラップするビューで機能しているように見えました。あなたはそれを試しましたか?

于 2012-02-03T01:59:45.800 に答える
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

于 2015-08-25T12:39:53.967 に答える