1

我正在尝试使用CATiledLayer+来实现我自己的地图引擎UIScrollView

drawLayer:inContext:我的实现方法中,如果我有当前边界框所需的某个图块图像,我会立即在上下文中绘制它。

但是,当我在本地缓存数据结构中没有可用的数据时,瓷砖图像是从瓷砖服务器异步请求/下载的,并且不会在上下文中绘制任何内容。

问题是,当我不在上下文中绘制任何东西时,视图的那一部分显示为空白图块。并且预期的行为是从以前的缩放级别显示放大的缩放平铺视图。

如果你们遇到任何类似的问题并找到任何解决方案,请告诉我。

4

4 回答 4

1

获得数据后,您必须立即为图块设置需要显示InRect:。在瓷砖可用之前,您必须忍受它是空白的,因为您无法影响 CATiledLayer 正在创建哪些瓷砖。

于 2011-06-20T10:26:09.293 回答
1

我做同样的事情,阻塞线程直到磁贴被下载。性能不错,运行流畅。我正在使用队列来存储每个磁贴请求,因此我还可以取消那些不再有用的磁贴请求。

为此,请在启动异步磁贴请求后立即使用锁停止线程,并在缓存磁贴后立即解锁。

你觉得好听吗?它对我有用!

于 2012-10-10T12:39:16.013 回答
0

你必须调用 setNeedsDisplay 或 setNeedsDisplayInRect: 但问题是如果你调用它,那么它将重绘滚动视图中的每个图块。所以尝试使用 UIView 的子类而不是 CATiledLayer 子类,并像这样实现 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];
    */
}

对于滚动视图,

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 回答