我是不是必须在我的 MKMapview 委托上实现 mapView:regionWillChangeAnimated:?

Posted

技术标签:

【中文标题】我是不是必须在我的 MKMapview 委托上实现 mapView:regionWillChangeAnimated:?【英文标题】:Do I have to implement mapView:regionWillChangeAnimated:on my MKMapview delegate?我是否必须在我的 MKMapview 委托上实现 mapView:regionWillChangeAnimated:? 【发布时间】:2011-01-30 01:44:18 【问题描述】:

Apple 的文档告诉您这种方法应该尽可能轻量级,这里的标准用途是什么?重置注释引脚?

告诉代表该地区 地图视图显示即将 改变。

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)动画

参数

mapView可见区域为的地图视图 即将改变。

动画如果是,则更改为新区域 将被动画化。如果否,则更改 将立即制作。

每当 当前显示的地图区域 变化。在滚动期间,此方法 可能会被多次打电话报告 更新地图位置。 因此,您对此的实施 方法应该是轻量级的 可以避免影响滚动 性能。

【问题讨论】:

【参考方案1】:

这个委托方法的问题是“在滚动过程中,这个方法可能会被多次调用以报告地图位置的更新”(所以你需要 IF/THEN 或 CASE/BREAK 等来保持它的“轻量级”)。

您根本不需要使用此方法(不是必需的),但如果您确实希望包含某种功能(例如删除无价值的引脚等),那么保持轻量级的示例代码将是:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
if(!animated)
//Instantaneous change, which means you probably did something code-wise, so you should have handled anything there, but you can do it here as well.

 else 
//User is most likely scrolling, so the best way to do things here is check if the new region is significantly (by whatever standard) away from the starting region

CLLocationDistance *distance = [mapView.centerCoordinate distanceFromLocation:originalCoordinate];
if(distance > 1000)
//The map region was shifted by 1000 meters
//Remove annotations outsides the view, or whatever
//Most likely, instead of checking for a distance change, you might want to check for a change relative to the view size





【讨论】:

哦,所以注释视图不会自动更正它们的位置? 视图可以,但引脚当然不会。我的意思是移除外部引脚。上面的代码实际上只适用于在区域变化时特别需要做某事的开发人员。如果您想记录人们一直在看什么,那就太好了。

以上是关于我是不是必须在我的 MKMapview 委托上实现 mapView:regionWillChangeAnimated:?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone MKMapView 注解聚类

我怎样才能在我的自定义表格视图单元格上实现这个 UI

如何在我的 mapview iOS 7 中使用 OpenLayer (OpenStreetMap) 瓦片

在我的 .NET Windows 窗体上实现从 Chrome 拖放

如果我不再使用它,为啥在释放 MKMapView 后我会崩溃?

如何使用蓝点在我的 MKMapView 上显示我当前的位置和区域?