0

我有一个使用 MapKit 的应用程序。
我在调整地图大小后计算当前缩放。
通过定义(来自MKGeometry.h文件)

MKZoomScale provides a conversion factor between MKMapPoints and screen points.
When MKZoomScale = 1, 1 screen point = 1 MKMapPoint.  When MKZoomScale is
0.5, 1 screen point = 2 MKMapPoints.

所以,我是这样计算的:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    CGSize screenSize = mapView.bounds.size;
    MKMapRect mapRect = mapView.visibleMapRect;
    MKZoomScale zoomScale = screenSize.width * screenSize.height / (mapRect.size.width * mapRect.size.height);
}

计算zoomScale符合定义(我已经检查过)。

我还在方法中在我的 mapView 上绘制了一个叠加层

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context

问题是,我的计算zoomScale不等于系统传递给这个方法的那个。我希望它们是相等的,因为drawMapRect:在调整大小之后调用(实际上,调整大小会导致调用此方法)。

这里有什么问题?

我也尝试使用

currentZoomScale = mapView.bounds.size.width / mapView.visibleMapRect.size.width;

, 建议在这里,但这currentZoomScale也不等于传递给drawMapRect:

4

1 回答 1

4

我和一位同事今天确实发现了一些奇怪的现象,可以解释这种行为:MKZoomScale传递到drawMapRect:方法中的 总是反映在MKMapView.

例如,如果您将地图操作为精确的缩放级别 7,它会从缩放级别 7 绘制地图图块,因此,缩放比例MKOverlay drawMapRect:1 / (2^(20-level)) = ~0.000122. 现在,如果您再放大一点,但不要放大到地图必须使用 8 级图块,您会期望drawMapRect:再次调用时缩放比例会增加。但是,缩放比例保持不变。

提示为什么会发生这种情况的一个行为如下:在内部放置一个断点drawMapRect:并稍微缩放 - 再次,不足以使用一组新的图块。你会注意到drawMapRect:实际上并没有被调用!实际上,只有两种方法可以调用它:

  1. 平移地图直到必须绘制一组新的图块
  2. 放大或缩小,直到达到必须渲染新级别瓷砖的阈值

回想起来,这完全有道理。Core Graphics 进行了高度优化,并希望尽可能少地进行绘图。当用户放大或缩小一点点时,它很可能使用覆盖图块的缓存图像并适当地放大或缩小它。

然后我们可以合理地假设,即使MKMapView0 到 1 之间的任何小数的缩放比例,MKOverlay只有当缩放比例达到需要重新绘制的阈值时才会绘制,即从 1 开始的整数缩放级别-20,即缩放比例为 1、1/2、1/4、1/8、1/16...

于 2014-07-25T05:17:38.457 回答