9

CATiledLayerバッキングのあるビューがあります。このCATiledLayerUIViewから表示されているタイルを取得し、それをCALayerバッキングとして別のビューに追加して、CATiledLayerを使用しない別のUIViewで表示されている画像を再作成したいと思います。

これを実行したい理由は、この2番目のUIViewを使用して、CATiledLayerでサポートされたUIViewの更新の影響をマスクするためです。これにより、現在、すべてのタイルが再ロードされるときにちらつきが発生します。

問題は、私がこれをどのように行うのか完全にはわからないということです。何か案は?

4

2 に答える 2

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

しかし、正直なところ、これは効率的ではないと思います。

于 2012-06-21T01:59:25.000 に答える
0

ここでの本当の問題は、ちらつきです。カスタム CALayer をサポートするビューで同様の問題がありましたが、これは解決策の一部でした: CALayer のカスタム サブクラスを作成し、次のメソッドを実装します。

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

これにより、一連の問題が修正されましたが、修正されない場合があります。別の方法として、更新中にトランザクションを無効にすることもできます。CATransaction クラス リファレンスから

setDisableActions: このトランザクション グループ内で行われたプロパティの変更の結果としてトリガーされるアクションを抑制するかどうかを設定します。

これを使用するには:

[CATransaction begin];
[CATransaction setDisableActions:YES];
// do updating/flickering stuff
[self doFlickeringThing];
[CATransaction commit];
于 2012-06-23T00:20:55.987 に答える