5

私の状況: コンテキストで素敵なグラフを描画する Graph クラスを呼び出す UIView を内部に持つ UIScrollView を作成しました。幅が 8192 ピクセルより大きい場合、電話は UIView をレンダリングしないことがわかりました。実際、Apple のドキュメントによると、1024px より大きくしたい場合は、CATiledLayer を実装する必要があります。

しかし、たくさん読んでグーグルで調べた後でも、このタスクの CAtiledLayer の基本を理解するのはまだ難しいと思います.Quartz と Cocoa、レイヤーとサブレイヤーとビューとサブビューの間でどういうわけか迷っています。

理想的には、Graph クラスをそのままにして、コンテキストを完全に描画し、それをタイルに分割してスクロールしたいと考えています。スクロールビューは水平方向にスクロールするだけで、ズームや垂直方向のスクロールは必要ありません。それは可能ですか?もしそうなら、私はどのように続けるべきですか?おそらく、タイルを使用するためにスクロールビュー、UIView、およびグラフクラスを再構築する方法の概要、箇条書きまたは擬似コードを誰かが教えてくれるかもしれません。

返信ありがとうございます。

4

1 に答える 1

4

ご依頼から一ヶ月経ちましたが、まだまだ使えそうです。今夜、CATiledLayer を使い始めました。CATiledLayer の背後にある考え方は、それをビューに追加することだと思います。

CATiledLayer *tiled = [CATiledLayer layer];
[self.view.layer addSublayer:tiled];

デリゲートを設定し、メソッドを 1 つだけ実装します。

MyTLDelegate *myDelegate = [[MyTLDelegate alloc] init];
tiled.delegate = myDelegate;
// I haven't checked if CATiledLayer retains myDelegate, check this!

...
@implementation MyTLDelegate {

-(void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)ctx
{
    CGRect dirtyRect = CGContextGetClipBoundingBox(ctx);
    // draw!
}

基本的にこれですべてです。座標空間全体がちょうどそこにあるかのように描画できます。そのため、Graph クラスをわずかに変更するだけで、CATiledLayer デリゲートとして機能できるようになります。私の場合、20 分間は十分に費やされ、ユーザー エクスペリエンスが数桁向上しました。(退屈なスクロール、スケーリング、再描画を自分で行うのと比較して)

ps。これはあなたが求めた疑似コードにすぎません。たとえば、品質やフレームサイズなど、物事を進めるために追加の接着剤が必要になる場合があります。

于 2011-01-03T05:35:34.037 に答える