当用户滚动 MKMapView 时,从 Core Data 加载其他对象

Posted

技术标签:

【中文标题】当用户滚动 MKMapView 时,从 Core Data 加载其他对象【英文标题】:Load additional objects from Core Data when a user scrolls an MKMapView 【发布时间】:2009-08-20 03:03:36 【问题描述】:

使用 iPhone 3.0 SDK 中的 MapKit,您可以创建符合 MKAnnotation 协议的对象。将这些加载到 MKMapView 上非常容易。然而,当用户滚动 MKMapView 时,是时候加载新的注释了。请求新对象的可能位置是 ma​​pView:regionDidChangeAnimated:,当地图的区域更改时调用它,然后用新的注释添加/替换注释。

具体来说,我想查询 Core Data 以检索当前 MKCoordinateRegion (mapView.region) 中存在的所有对象,以便我只加载将显示在屏幕。 Core Data 中的对象具有纬度和经度属性(CLLocation 属性定义在类的 .m/.h 中,我可以从中手动填充)并将其用于 NSPredicate 以查找附近的对象。

由于 Core Data 数据库中存在多少对象的性质,我们不能将所有对象作为注释预加载,否则我们会耗尽内存(而且速度会非常慢)。

如何仅检索在当前地图视图范围内具有位置的对象?

【问题讨论】:

【参考方案1】:

对不起,英语不是我的母语..

一旦用户向下或向上滚动.. 区域值将会改变,尤其是 regionDidChangeAnimated 中的 latitudeDelta 和 longitudeDelta。从那里,您可以获取当前 mapView 的边界..(minlat, minlong, maxlat, maxlong)

minlat = current_coordinate_lat - latitudeDelta; //note everything is in dd (decimal degrees)

maxlat = current_coordinate_lat + latitudeDelta;

minlong = ...

maxlong = ...

既然你已经有了计算的边界,那么你可以处理需要显示的对象,然后在地图中添加注释。我已经尝试了以下值..

在此处查看图片.. http://img43.imageshack.us/img43/703/picture1txe.png

从那里..我可以执行 sqlite3 sql 语句来获取该范围内的点..

SELECT * FROM pois WHERE categ_id = %@ AND (sat_latitude > %f AND sat_latitude < %f) AND (sat_longitude > %f AND sat_longitude < %f)

【讨论】:

这个一般概念对我很有效!唯一令人讨厌的是它正在加载超出矩形边界的对象,因此用户不会看到它丢弃了引脚。这主要是装饰性的,所以不急于解决它。任何想法为什么它超出了界限?我只能假设边界报告的内容大于屏幕上可见的内容。想法? Kevin,你得到太多物体的原因是因为纬度和经度增量都需要先减半,因为它们代表整个区域的距离,而不仅仅是从中心。所以例如:minLat = currentCenter - (latDelta / 2) 等

以上是关于当用户滚动 MKMapView 时,从 Core Data 加载其他对象的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 在滚动到底部并触发控制中心后停止滚动

更新用户位置或使用默认值时刷新 MKMapView

当用户移动地图时,停止 MKMapView 移动到用户的当前位置

将平移手势传递给 MKMapView

当mapView为3D时,iOS MapKit获取MKMapView的实际可见区域

iOS:每次用户加载应用程序时如何刷新 MKMapView 用户位置