MKMapView 自己缩小

Posted

技术标签:

【中文标题】MKMapView 自己缩小【英文标题】:MKMapView zooms itself out 【发布时间】:2012-08-21 19:22:30 【问题描述】:

这是我的一个小方法,它获取位置管理器的当前位置并将地图聚焦在其上方一点点,以便为我添加到地图顶部的其他一些子视图腾出空间。如果跨度的纬度/经度增量太大(大于 1.0),则每次设置区域时,跨度都会变得越来越大,直到地图一直缩小,即使没有实际接触地图。我认为这与重用地图视图的跨度有关,但我不知道到底发生了什么。

- (void)setRegion 
    CLLocationCoordinate2D coord = locationManager.location.coordinate;

    MKCoordinateSpan span = mapView.region.span;

    coord.latitude += 0.002 * (span.latitudeDelta / 0.012523);

    MKCoordinateRegion region = MKCoordinateRegionMake(coord, span);
    [mapViewGlobal setRegion:region animated:animated];

【问题讨论】:

setRegion:animated: 之后的结果范围可能与输入范围略有不同。这是 MKMapView 的一个已知问题。在您的情况下,跨度可能每次都会变大。 我知道生成的跨度并不完全相同,但在我的情况下,我将地图放大到足够远,以便您可以看到各个城市,并且在此方法的 4-5 次迭代中地图被完全放大,甚至没有触及地图本身。 变量“animated”从何而来?是还是不是? 【参考方案1】:

来自 Apple 的文档“如果您想在不更改缩放级别的情况下更改中心坐标,请改用 setCenterCoordinate:animated:。” MKMapView

- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated

MKMapView 将选择一个新区域,该区域非常适合重新定义的缩放级别,同时仍显示您的整个目标区域,并且每次您向北移动时,跨度都会发生变化,事情就会失控。

另外,您计算纬度变化幅度的方法有点奇怪。除了在可以做到这一点时进行倍数和除法之外,它只能在一定的纬度(它们远离赤道)和一定的缩放级别上工作。您最好计算出地图需要滚动多少像素(大概是子视图高度的一半),然后使用此函数计算出需要将地图居中的位置。

- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view

另一种方法是将子视图放在 MKMapView 之外,但这会影响您的美观。

【讨论】:

太棒了。 setCenterCoordinate: 是完美的。我不完全明白我将如何使用convertPoint: 来聚焦地图,以便坐标水平居中但定位为 y 值为地图高度的 2/3 而不是 1/2。 如果您希望您的注释位于子视图未覆盖的区域的中心,您需要使地图查看不同的中心点。如果子视图在 600 像素地图视图的顶部为 100 像素,则您的注释需要在中心下方 50 像素。不管它是多少度数,它都是您想要的像素数(除非您的子视图以度数为单位)。因此,找出中心注释上方 50 像素的屏幕点的坐标并平移到该坐标,从而将注释向南移动 50 像素并进入非子视图区域的中间。

以上是关于MKMapView 自己缩小的主要内容,如果未能解决你的问题,请参考以下文章

iOS 5 中无效的 MKMapView 区域

在 MkMapView 上隐藏、显示注释

相对于缩放级别缩放 MKMapView 注释

MKMapView 区域在 iOS7 中方向更改后损坏

如何在当前位置设置 MKMapView 区域并关注用户位置?

自定义地图所需的 MKMapView“合法”标签?