drawLayer:inContext:呼び出しの間にCALayerのコンテンツを維持するための組み込み機能はありますか?現在、drawLayer:inContext:でコールバックするたびに、レイヤーをバッファーにコピーし、バッファーから画像を再描画していますが、CALayerにこれを自動的に行う方法があるかどうか疑問に思っています...
1 に答える
私はそうは思わない。'drawInContext'は、基になるバッファをクリアして、それに描画できるようにします。ただし、drawInContext
またはdrawRect
メソッドを使用しない場合は、layer.contentsをCGImageに設定すると、それが保持されます。
私は個人的にほとんどすべてのルーチンでこれを行っています。- (void) setFrame:(CGRect)frame
フレームサイズが変更されているかどうかを確認するために上書きします。変更された場合は、通常の描画ルーチンを使用して画像を再描画しますが、コンテキストに追加しますUIGraphicsBeginImageContextWithOptions(size, _opaque, 0);
。次に、その画像を取得してimageCacheに設定できますcachedImage = UIGraphicsGetImageFromCurrentImageContext();
。次に、layer.ContentsをCGImageに設定します。私はこれを使って自分の絵をキャッシュするのを手伝っています。特に、iPad2が点滅しない多くの描画ルーチンでは遅い新しいiPadで。
この方法のその他の利点:個別の共有キャッシュを設定すると、キャッシュされた画像をビュー間で共有できます。キャッシュを適切に管理している場合、これはメモリフットプリントに非常に役立ちます。(ヒント:共有画像の辞書キーとしてNSStringFromCGSizeを使用します)。また、実際に別のスレッドで描画ルーチンをスピンオフし、完了したらレイヤーの内容を設定することもできます。これにより、描画ルーチンがメインスレッドをブロックするのを防ぎます(この場合、新しい画像が設定されるまで、現在の画像が引き伸ばされる可能性があります)。