我一直在使用iOS 7 中的MKMapView尝试以编程方式设置和获取缩放级别,以便在我离线时下载和重用地图图块。
由于我无法将整个地图下载到手机中,因此我只下载了适当缩放级别的几个图块,然后我修复了该缩放级别并使用MKTileOverlay和MKTileOverlayRenderer等图块。
我尝试使用 Troybrant 的算法(http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview),但对我来说效果不佳。它未能正确建立缩放级别。
所以我创建了一个我自己的,效果很好。
关于我自己的方法的一些解释:
在最大地图缩放级别 (20) 下,您会以 1:1 的比例看到每个地图点。整个地图将有 256*2^20 点。
在视网膜显示器中,地图点和像素之间的比例因子为 2.0。
Apple 地图可以将缩放级别从 3 更改为 19(最小和最大)
然后有一个简单的逆规则:
- 在最大缩放级别下,我们的视图将显示与其拥有的像素一样多的点(对于视网膜显示器,点像素比例因子为 2.0)
- 如果缩放级别降低,则显示的地图点数量应增加(逆规则)
有了这些信息,想法是设置MKMapView 的 visibleRect属性:
visibleRect width points = 2.0 * mapView.bounds.size.width * 2^(20-zoom)
使用该公式,我已经能够将我的地图居中并正确应用到它们的缩放级别。
正如 Troybrant 所做的那样,我使用以下方法创建了一个类别:
@interface MKMapView (ZoomLevel)
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated;
@end
@implementation MKMapView (ZoomLevel)
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated
{
MKMapPoint centrePoint = MKMapPointForCoordinate(centreCoord);
CGFloat rectWidth = 2.0 * self.bounds.size.width * pow(2, 20-zoomLevel);
CGFloat rectHeight = 2.0 * self.bounds.size.height * pow(2, 20-zoomLevel);
MKMapRect visibleRect = MKMapRectMake(centrePoint.x-rectWidth/2, centrePoint.y-rectHeight/2, rectWidth, rectHeight);
[self setVisibleMapRect:visibleRect animated:animated];
}
@end
我希望这段代码可以帮助到大家。