我希望
MKMapView
继承自UIScrollView
,就像UITableView
和UICollectionView
一样。这样您就可以重写 UIScrollView
委托方法并执行您需要执行的操作。
我找到了将平移手势附加到
MapView
的方法,如下所示:
UIPanGestureRecognizer* mapPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(mapPanGestureHandler:)];
[mapPanGestureRecognizer setDelegate:self];
[self.mapView addGestureRecognizer:mapPanGestureRecognizer];
除了
mapView
有一个减速元件之外,它的效果相当好。例如,如果您在滚动过程中抬起手指,地图会继续移动并减慢速度,然后最终停止。
我正在做的是使用核心图形在我的地图(另一个
UIView
)顶部的叠加层中渲染一些屏幕外注释。除了减速问题之外,它工作得很好。
我需要知道的是地图已经移动了。我需要的参数可以直接从地图本身查询。
有人找到了一种在减速时获得回调的技术吗?我的意思是,我想我可以在手势结束时使用计时器来重复触发半秒左右。
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
}
您可以专门使用它并丢弃手势识别器,或者保留手势识别器并在不需要时暂停链接。
MKMapViewDelegate
协议定义了当地图显示的区域发生变化时将被调用的mapView:regionDidChangeAnimated:
。当地图滚动时它会被重复调用 -
讨论每当当前显示的地图时都会调用此方法 地区变化。滚动过程中,该方法可能会被调用多次 报告地图位置的更新。因此,您的实施 该方法应尽可能轻量级,以避免影响 滚动性能。
您应该能够使用此方法访问新的地图区域并重新绘制叠加层(或者,如果重新绘制非常耗时,您可以在另一个线程上分派任务来重新绘制叠加层)
在 Swift 中,您应该使用以下代码。滚动后将调用以下重写的方法。您还可以使用
CLLocationCoordinate2DMake
检测滚动量,如下所示。
extension UIViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
let coordinate = CLLocationCoordinate2DMake(mapView.region.center.latitude, mapView.region.center.longitude)
}
}
我目前正在使用 iOS 15。
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) { }
可以根据 Apple 文档帮助检测“地图的滚动”。