gpt4 book ai didi

ios - 调整 MKMapView 大小后的 zoomScale 不等于绘制 MKOverlay 时的 zoomScale

转载 作者:行者123 更新时间:2023-11-28 19:08:28 26 4
gpt4 key购买 nike

我有一个使用 MapKit 的应用程序。
我在调整 map 大小后计算当前缩放比例。
通过定义(来自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;

,建议here ,但是这个 currentZoomScale 也不等于传递给 drawMapRect:

最佳答案

我和一位同事今天确实发现了一些可能解释此行为的怪事:传递到 drawMapRect: 方法中的 MKZoomScale 始终反射(reflect) map 的当前缩放级别在 MKMapView 中绘制的图 block 。

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

一个行为提示了为什么会发生这种情况,如下所示:在 drawMapRect: 中放置一个断点并稍微缩放一点——同样,这不足以使用一组新的图 block 。您会注意到 drawMapRect: 实际上并没有被调用!事实上,只有两种方法可以让它被调用:

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

回想起来,这是非常有道理的。 Core Graphics 是高度优化的,希望尽可能少地绘制。当用户放大或缩小一点点时,它很可能会使用缓存的叠加图 block 图像并适本地放大或缩小它。

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

关于ios - 调整 MKMapView 大小后的 zoomScale 不等于绘制 MKOverlay 时的 zoomScale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18087977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com