我正在尝试找到一种可靠的方法来确定任何给定时刻(当用户放大/缩小和平移时)MKMapView中当前可见的平铺的MKTileOverlayPath。我的应用程序显示来自MKTileOverlayPath查询的服务器的动态内容。
有没有办法直接从MKMapView或MKTileOverlay类中确定这个?
到目前为止,我一直在尝试使用下面的代码计算tilepath。当用户平移或双击放大时,它可以正常工作。但是,当捏合放大/缩小(缩放级别可以连续)时,使用此方法计算的切片有时不正确 - 特别是y坐标似乎是一次性的。
我很难弄清楚为什么代码无法正常使用捏缩放级别,所以我想知道是否有另一种方法来确定当前可见的切片。我已经尝试实现一个虚拟的MKTileOVerlay来拦截所请求的磁贴,但是目前在任何给定时间都没有看到它。
任何提示都将不胜感激。
- (NSMutableArray *)tilesInMapRect:(MKMapRect)rect zoomScale:(MKZoomScale)scale
{
NSInteger z = [self zoomLevel];
NSInteger minX = floor((MKMapRectGetMinX(rect) * scale) / TILE_SIZE);
NSInteger maxX = floor((MKMapRectGetMaxX(rect) * scale) / TILE_SIZE);
NSInteger minY = floor((MKMapRectGetMinY(rect) * scale) / TILE_SIZE);
NSInteger maxY = floor((MKMapRectGetMaxY(rect) * scale) / TILE_SIZE);
NSMutableArray *tiles = nil;
for (NSInteger x = minX; x <= maxX; x++) {
for (NSInteger y = minY; y <= maxY; y++) {
NSString *tileString = [NSString stringWithFormat:@"z%ix%iy%i",z,x,y];
if (!tiles) {
tiles = [NSMutableArray array];
}
[tiles addObject:tileString];
}
}
return tiles;
}
- (NSUInteger) zoomLevel {
return (21 - round(log2(self.mapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * self.mapView.bounds.size.width))));
}