MapView检测滚动

时间:2014-04-16 23:45:57

标签: ios uiview mapkit

我希望MKMapView继承UIScrollView,就像UITableViewUICollectionView一样。这样,您可以覆盖UIScrollView委托方法并执行您需要执行的操作。

我找到了将平移手势附加到MapView的方法,如下所示:

UIPanGestureRecognizer* mapPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(mapPanGestureHandler:)];
[mapPanGestureRecognizer setDelegate:self];
[self.mapView addGestureRecognizer:mapPanGestureRecognizer];

除了mapView有减速元素这一事实外,这种方法效果相当不错。例如,如果您在中间滚动并抬起手指,地图会继续前进并减速然后最终停止。

我正在做的是使用核心图形在地图顶部(另一个UIView)的叠加层中渲染一些屏幕外注释。除减速问题外,它的工作效果很好。

我需要知道的是地图已经移动了。我需要的参数我可以直接从地图本身查询。

有没有人找到一种技术来减速时获得回调?我的意思是我想我可以在手势结束时重复射击半秒钟左右使用计时器。

3 个答案:

答案 0 :(得分:12)

MKMapView没有与UIScrollView类似的委托回调,因此您需要即兴创作。

  

有没有人找到一种技术来减速时获得回调?我的意思是我想我可以在手势结束时重复射击半秒左右使用计时器。

如果您想要准确地将视图与地图的移动保持同步,那么最好使用CADisplayLink,因为您会在每次屏幕刷新后收到回调。另一方面,如果您使用计时器,则回调不一定与刷新率一致,您可能会看到工件。

您可以这样设置:

CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateViewsBasedOnMapRegion:)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

然后像这样处理回调:

- (void)updateViewsBasedOnMapRegion:(CADisplayLink *)link
{
    // update whatever it is you need to update
}

您可以专门使用此功能并丢弃手势识别器或保留手势识别器并在不需要时暂停链接。

答案 1 :(得分:0)

MKMapViewDelegate协议定义mapView:regionDidChangeAnimated:,当地图显示的区域发生变化时,将调用{{1}}。它在地图滚动时反复调用 -

  

讨论只要当前显示的地图,就会调用此方法   地区变化。在滚动期间,可以多次调用此方法   报告地图位置的更新。因此,您的实施   这种方法应该尽可能轻,以免影响   滚动表现。

您应该可以使用此方法访问新地图区域并重绘您的叠加层(或者如果重新绘制非常耗时,您可以在另一个线程上调度任务以重新绘制叠加层)

答案 2 :(得分:0)

Swift 中,您应该使用以下代码。滚动后跟随覆盖方法将被调用。您也可以使用CLLocationCoordinate2DMake来检测滚动量,如下所示。

extension UIViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 
       let coordinate = CLLocationCoordinate2DMake(mapView.region.center.latitude, mapView.region.center.longitude) 
    }
}