MapView检测滚动

我希望从UIScrollViewUITableViewUICollectionViewinheritance的MKMapView 。 这样你可以覆盖UIScrollView委托方法,并做你需要做的。

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

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

除了mapView有一个减速元素的事实之外,这个效果还算不错。 例如,如果您在中途滚动并抬起手指,则地图会继续前进并放慢速度,然后最终停止。

我正在做的是使用核心graphics在我的地图(另一个UIView )的覆盖上渲染一些离屏注释。 除了减速问题之外,它工作得很好。

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

有没有人find一种技术来减速时获得callback? 我的意思是,我想我可以使用一个计时器,当手势结束反复发射半秒钟左右。

MKMapView没有类似的委托callback到UIScrollView ,所以你将需要即兴创作。

有没有人find一种技术来减速时获得callback? 我的意思是,我想我可以使用一个计时器,当手势结束反复发射半秒钟左右。

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

你可以这样设置:

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

然后像这样处理callback:

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

您可以独占使用此function并放弃手势识别器,或保留手势识别器,并在不需要时暂停链接。

MKMapViewDelegate协议定义了mapView:regionDidChangeAnimated:当地图显示的区域发生变化时将被调用。 它在地图滚动时反复调用 –

讨论只要当前显示的地图区域更改,就会调用此方法。 在滚动过程中,可能会多次调用此方法以将更新报告给地图位置。 因此,您的这种方法的实现应尽可能轻量级,以避免影响滚动性能。

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