12

iPhoneでは(Cocoaでも同様に有効な質問だと思いますが)、CATiledLayerに裏打ちされたUIViewの周りにUIScrollViewがあります。デフォルトで機能する方法は、ビューポートがCATiledLayerの空白のセクションをスクロールしたときに、キャッシュされていない/フェッチされていないタイルをロードすることです。

私が知りたいのは、CATiledLayerをトリガーして、アクティブに表示されていないタイルをロードする方法があるかどうかです。たとえば、現在表示されているタイルに隣接するすべてのタイルを画面外にプリロードして、非同期で読み込まれると画像にフェードインする空白の画面が点滅しないようにします。

何か案は?

4

3 に答える 3

14

私は、CATiledLayer があなたが望むことをするとは思わない。ただし、他にもいくつかのオプションがあります。まず、タイルのフェードインを無効にして、次のようにしてすぐに表示することができます。

@interface NoFadeTiledLayer : CATiledLayer {
}
@end

@implementation NoFadeTiledLayer
+ (CFTimeInterval)fadeDuration {
    return 0.0;
}
@end

@implementation MyViewWithTiledLayer
+ (Class)layerClass {
    return [NoFadeTiledLayer class];
}
...
@end

2 番目に、隣接するタイルのプリフェッチとキャッシュを独自に実行できるため、CATileLayer が drawLayer:inContext を呼び出したときにすぐに使用できるようになります。scrollViewDidScroll: と scrollViewDidZoom: を実装して、隣接するタイルと levelOfDetail を判断します。次に、キャッシュ ルックアップを実行し、存在しないものをプリフェッチ/レンダリング キューに追加します。バックグラウンド スレッドがキューを処理し、その後のスクロールまたはズームによってキューがクリアされ、再構築される可能性があります。次に、最初に drawLayer:inContext でキャッシュをチェックし、必要な場合にのみフェッチ/レンダリングします。

于 2011-03-01T23:13:14.537 に答える
4

CATileLayer は、優れた機能を 1 つ備えていても、柔軟性がないという苛立たしいクラスの 1 つです。

この時点で私たちに残されているのは創造性だけです。

1) スクロール ビューを大きくします。「空白」のタイルが表示されなくなる前に、画面のサイズを 5 倍にしてみました。メモリの使用に注意してください!ユーザーには 2% しか表示されていませんが、広大な領域に描画しています。

2) 高解像度と低解像度の 2 つのバージョンの画像を用意します。低解像度を非常に迅速にブリットできるはずで、基本的に「空白」のタイルではなく「ぼやけた」タイルになります。Apple のサンプル コード ZoomingPDFViewer は、これを行う方法を示しています。

http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html

もちろん、時間を投資したい場合は、この 2 つを組み合わせて使用​​することもできます。

于 2011-02-28T06:27:48.583 に答える
0

表示したい領域で setNeedsDisplayInRect: を呼び出してみてください。タイルの境界内に収めたい場合は、 tileSize プロパティを使用してタイルの境界を計算できます。

しかし、これが機能するかどうかはわかりませんし、タイル キャッシュ メカニズムがどのように機能するかもわかりません。

于 2009-07-15T23:26:06.513 に答える