MapView 检测滚动

问题描述 投票:0回答:4

我希望

MKMapView
继承自
UIScrollView
,就像
UITableView
UICollectionView
一样。这样您就可以重写
UIScrollView
委托方法并执行您需要执行的操作。

我找到了将平移手势附加到

MapView
的方法,如下所示:

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

除了

mapView
有一个减速元件之外,它的效果相当好。例如,如果您在滚动过程中抬起手指,地图会继续移动并减慢速度,然后最终停止。

我正在做的是使用核心图形在我的地图(另一个

UIView
)顶部的叠加层中渲染一些屏幕外注释。除了减速问题之外,它工作得很好。

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

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

ios uiview mapkit
4个回答
15
投票

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
}

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


0
投票

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

讨论每当当前显示的地图时都会调用此方法 地区变化。滚动过程中,该方法可能会被调用多次 报告地图位置的更新。因此,您的实施 该方法应尽可能轻量级,以避免影响 滚动性能。

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


0
投票

Swift 中,您应该使用以下代码。滚动后将调用以下重写的方法。您还可以使用

CLLocationCoordinate2DMake
检测滚动量,如下所示。

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

0
投票

我目前正在使用 iOS 15。

func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) { }

可以根据 Apple 文档帮助检测“地图的滚动”。

© www.soinside.com 2019 - 2024. All rights reserved.