2012-06-18 12 views
9

私はCATiledLayerバッキングを持つビューを持っています。私はこのCATiledLayer UIViewから可視のタイルを取り出し、そのCALayerバッキングとして別のビューに追加して、CATiledLayerを使用しない別のUIViewで可視イメージを再作成します。CATiledLayer to CALayer

私はこの2番目のUIViewを使用して、CATiledLayerのバックアップUIViewを更新する効果をマスクすることになります。これは現在、すべてのタイルが再読み込みされるにつれてフリッカーを生成します。

問題は、私はこれをどうやって行うのか完全にはわかりません。何か案は?

+1

だから、あなたが意図的にタイル張りのビューを取ると、タイル張りのビューを非表示にするには、通常のビューを作りたいですか...?たぶん狂った質問かもしれませんが、それはなぜ始まったのですか? –

+0

@PauldeLange - 私のタイル表示が再ロードされるとき、タイルが再描画されると 'ちらつき'します。上のタイルの直接コピーになるタイル表示の下にUIViewがあります。次に、タイルが再ロードされると、タイルが再ロードされると、下のビューが1秒間表示され、フリッカーの影響が止まります。私は、グラフィックス・プログラムでは、グラフィック・バッファーを使用して、上の新しいコンテンツのレンダリングの影響を滑らかにすることを、かなり一般的な方法と言います。 –

+0

背景ビューをタイルより速くレンダリングできる場合は、なぜタイルがありますか?途中で影響を与える - >効果。 –

答えて

3

CATiledLayerは非同期に複数の詳細レベルでキャッシュされた潜在的 層のコンテンツのタイルを、提供 への道を提供するのCALayerのサブクラスです。

あなたがしてCGContextRefに層中に目に見えるものをレンダリングすることができます

- (void)renderInContext:(CGContextRef)ctx 

そして設定することによって、そのデリゲートをあなたの他の層を更新するために、これを使用して実装する

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

ここに示されたssはhttp://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

しかし、私はこれが効率的だとは思わない。

+0

答えをありがとう。それは効率的ではないとあなたは言う。私のちらつきの問題を解決するのに役立つ他のアイデアはありますか? –

+0

@Luis 'renderInContext'は' CALayer'が 'CATiledLayer'で動作しないようです。タイルはまったくレンダリングされません。何か案は? – Tim

0

あなたの本当の問題はここではちらつきです。私はこれが解決策の一部であった、カスタムのCALayerはそれをバックアップしてビューに同様の問題があった: あなたのCALayerのカスタムサブクラスを作成し、次のメソッドを実装します。

- (void) display { 
    self.contents = nil; 
    [super display]; 
} 

はこれがために問題のセットを固定私は、あなたのためにそれを修正することはできません。

CATransaction Class ReferenceからsetDisableActions:アクションはこのトランザクション・グループ内で行われた プロパティの変更が抑制された結果、起動するかどうかを設定し、あなたが更新している間の取引を無効にするかもしれための代替。

だから、これを使用するには:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// do updating/flickering stuff 
[self doFlickeringThing]; 
[CATransaction commit];