【问题标题】:How to get notified when map zoom or scroll animation has finished?如何在地图缩放或滚动动画完成时收到通知?
【发布时间】:2014-07-30 07:31:15
【问题描述】:

我是非常 iOS 编程的新手,很抱歉这个问题听起来很琐碎。但是在网上搜索了几个小时后,我放弃了。

我需要在我的 iOS 应用程序中获取地图的当前缩放级别,这样当我更改当前视图时,我可以保留缩放级别。使用this code,我可以获取和设置缩放级别。我实现了MKMapViewDelegate协议的mapView:regionDidChangeAnimated:方法。但是这个方法在地图的初始“放大”动画期间被多次调用,如果在此期间我需要更新地图,我可能有错误的缩放级别。我当然不想关闭地图动画。因此,我一直在寻找一种方法来确定地图当前是动画还是静止,然后再读取和存储缩放级别。

我正在使用MKMapView

【问题讨论】:

  • 你用的是MKMapview还是谷歌地图?
  • @kirtiavaiya MKMapView.
  • 我想你可能会使用 MKMapview ,你能说说你为什么使用 MapKit
  • @kirtiavaiya 我的错。我也更新了问题。
  • 您会“改变当前视图” 地图正在制作动画吗?这似乎不太可能。此外,MKMapView 并不像谷歌地图那样真正适用于“缩放级别”。相反,您可能会发现在视图更改之前存储 region 或 visibleMapRect 属性更简单,返回时执行 mapView.region = savedRegion 或 mapView.visibleMapRect = savedVisibleMapRect。

标签: ios xcode mapkit


【解决方案1】:

你可以通过下面的代码试试

#define MERCATOR_RADIUS 85445659.44705395
#define MAX_GOOGLE_LEVELS 20

@interface MKMapView (ZoomLevel)
- (double)getZoomLevel;
@end

@implementation MKMapView (ZoomLevel)

- (double)getZoomLevel
{
CLLocationDegrees longitudeDelta = self.region.span.longitudeDelta;
CGFloat mapWidthInPixels = self.bounds.size.width;
double zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapWidthInPixels);
double zoomer = MAX_GOOGLE_LEVELS - log2( zoomScale );
if ( zoomer < 0 ) zoomer = 0;
//  zoomer = round(zoomer);
return zoomer;
}

@end

【讨论】:

  • 我实际上是在使用此代码来获取缩放级别。但是,我应该在哪里打电话给getZoomLevel()?正如我在问题中提到的,mapView:regionDidChangeAnimated: 在初始地图放大期间被多次调用。
  • 它会被调用,因为你试图改变地图视图,所以如果视图改变,这个方法也会被调用
  • 假设我在放大动画期间将缩放级别从 1 更改为 17。mapView:regionDidChangeAnimated: 多次。我怎么知道什么时候打电话给getZoomLevel()
  • 您可以在此处查看该事件stackoverflow.com/questions/8076555/…
  • 我应该如何使用该代码?就我而言,没有可供用户选择的注释。
猜你喜欢
  • 2011-01-22
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多