1

CATiledLayer+を使用して独自のマップ エンジンを実装しようとしていますUIScrollView

私の実装方法ではdrawLayer:inContext:、現在のバウンディング ボックスに必要な特定のタイル イメージがある場合、コンテキスト内ですぐに描画します。

ただし、ローカル キャッシュ データ構造に使用可能なものがない場合、タイル イメージはタイル サーバーから非同期的に要求/ダウンロードされ、コンテキスト内には何も描画されません。

問題は、コンテキストで何も描画しないと、ビューのその部分が空白のタイルとして表示されることです。また、予想される動作は、前のズーム レベルから拡大縮小されたタイル ビューを表示することです。

同様の問題に直面したことがあり、これに対する解決策を見つけた場合は、お知らせください。

4

4 に答える 4

1

データを取得したらすぐに、タイルに NeedsDisplayInRect: を設定する必要があります。CATiledLayer が作成しているタイルに影響を与える方法がないため、タイルが使用可能になるまで空白のままにしておく必要があります。

于 2011-06-20T10:26:09.293 に答える
1

同じことを行い、タイルがダウンロードされるまでスレッドをブロックします。性能は良く、スムーズに動きます。キューを使用してすべてのタイル リクエストを保存しているので、不要になったタイル リクエストをキャンセルすることもできます。

これを行うには、非同期タイル リクエストを起動した直後にロックを使用してスレッドを停止し、タイルがキャッシュされたらすぐにロックを解除します。

いいですね?それは私のために働いた!

于 2012-10-10T12:39:16.013 に答える
0

setNeedsDisplay または setNeedsDisplayInRect を呼び出す必要があります。ただし、これを呼び出すと、scrollView 内のすべてのタイルが再描画されるという問題があります。そこで、CATiledLayer サブクラスの代わりに UIView のサブクラスを使用してみて、次のように TiledView (UIView のサブクラス) を実装します。

+ (Class) layerClass {
    return [CATiledLayer class];
}

-(void)drawRect:(CGRect)r {
    CGRect tile = r;
    int x = tile.origin.x/TILESIZE;
    int y = tile.origin.y/TILESIZE;
    NSString *tileName = [NSString stringWithFormat:@"Shed_1000_%i_%i", x, y];
    NSString *path =
        [[NSBundle mainBundle] pathForResource:tileName ofType:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    [image drawAtPoint:tile.origin];
    // uncomment the following to see the tile boundaries
    /*
    UIBezierPath* bp = [UIBezierPath bezierPathWithRect: r];
    [[UIColor whiteColor] setStroke];
    [bp stroke];
    */
}

scrollViewの場合、

UIScrollView* sv = [[UIScrollView alloc] initWithFrame:
                    [[UIScreen mainScreen] applicationFrame]];
sv.backgroundColor = [UIColor whiteColor];
self.view = sv;
CGRect f = CGRectMake(0,0,3*TILESIZE,3*TILESIZE);
TiledView* content = [[TiledView alloc] initWithFrame:f];
float tsz = TILESIZE * content.layer.contentsScale;
[(CATiledLayer*)content.layer setTileSize: CGSizeMake(tsz, tsz)];
[self.view addSubview:content];
[sv setContentSize: f.size];
于 2013-03-20T09:03:30.573 に答える
0

予想どおりCATiledLayer、前のズーム レベルからこのタイルを提供する必要があります。タイル レイヤーの設定levelsOfDetailは何ですか?levelsOfDetailBias

于 2012-02-03T01:09:42.987 に答える