【发布时间】:2015-12-02 15:17:59
【问题描述】:
我正在尝试在 MKMapView 上向用户显示数以千计的潜在图钉(注释)。有谁知道地图是否使用遮挡剔除来仅渲染可见注释?
这适用于使用 xCode 6.4 的 iOS 7+
【问题讨论】:
标签: ios xcode mkmapview mkannotation occlusion-culling
我正在尝试在 MKMapView 上向用户显示数以千计的潜在图钉(注释)。有谁知道地图是否使用遮挡剔除来仅渲染可见注释?
这适用于使用 xCode 6.4 的 iOS 7+
【问题讨论】:
标签: ios xcode mkmapview mkannotation occlusion-culling
在谈论管理大量注释时,我们应该区分“注释”和“注释视图”。当您向地图视图添加许多注释时,这些轻量级 MKAnnotation 对象的集合仍保留在 annotations 数组中。但是地图视图提供了一种机制来缓解大量相关“注释视图”可能引起的内存问题。
当您向地图视图添加数千个注释时,唯一实例化的注释视图是可见的(以及靠近地图可见部分的注释视图。如果您在viewForAnnotation 中正确使用dequeueReusableAnnotationViewWithIdentifier,当您滚动并且注释视图消失时,当它需要新的注释视图时,它将回收那些已经滚动到视图之外的视图:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier)
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
} else {
annotationView?.annotation = annotation
}
return annotationView
}
因此,这将注释视图的数量保持在某个可管理的数量,在绝对需要它们之前不一定实例化新的注释视图(即,不会碰巧有任何旧的注释视图已经滚动到视图之外,可用重复使用)。
但是,如果用户在地图上缩小以至于同时可见的注释视图数量难以管理,则您必须自己管理这种情况。回到 WWDC 2011,有一个视频 Visualizing Information Geographically with MapKit 展示了处理大量注释时的有趣模型。具体来说,它们处理的是您缩小并且注释视图太多以至于它们开始重叠并变得太多的问题。该视频演示了一种方法,在该方法中,您可以在滚动时将注释视图聚合在一起(如有必要)。实现是相当初级的,但它说明了这个概念。
【讨论】: