在MKMapView中加载可见区域的注释

Fer*_*ndo 14 objective-c iphone-sdk-3.0

我有大约400个MKAnnotationView同时加载到MKMapView中.

我知道这不是什么好事,它有点慢,我想以"正确"的方式做到这一点.

我用中心坐标缩放地图:

MKCoordinateSpan span;
span.latitudeDelta = 0.8;
span.longitudeDelta = 0.8;

MKCoordinateRegion region;
region.span = span;

region.center = self.selectedCounty.coordinate;

[mapView setRegion:region animated:TRUE]; 
Run Code Online (Sandbox Code Playgroud)

我只希望加载注释,可能是在该地区可见.

我有一个自定义MKAnnotation,简称为"注释",带有CLLocationCoordinate2D-和title-property.

我只是想在MKMapView上加载"可见区域"的注释,因此并非所有注释都同时加载.当MKMapView上的"可见区域"发生变化时,我当然希望为该区域加载注释.

我知道MKMapView有一个委托方法,它在区域变化时运行.

但是,我怎么知道我应该为该区域加载哪些注释?

Shm*_*idt 36

MKMapRect visibleMapRect = mapView.visibleMapRect;
NSSet *visibleAnnotations = [mapView annotationsInMapRect:visibleMapRect];
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,比方法更快,它是log n而不是N. (6认同)

The*_*der 21

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html

MKMapRectContainsPoint会告诉您它是否可见.

visibleCount = 0;
for (MyAnnotation *annotation in mapView.annotations) {
    if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(annotation.coordinate)))
    {
        visibleCount++;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您有很多注释,我建议在后台线程上执行此方法.但您可以确定它是否在地图中可见

  • 不,这不是正确答案,它需要检查地图上的每个注释,请参阅下面的答案,以及annotationsInMapRect方法的apple文档,其中说明"此方法比在注释中对对象进行线性搜索要快得多属性自己.",annotationsInMapRect使用树来存储和搜索点. (2认同)

Ser*_*amá -2

您可以获得地图区域跨度和中心,并根据注释的位置,您可以检查该区域内是否有任何注释...也许它已经在 [mapview isAnnotationVisible] 之类的东西中实现...但您会最终必须检查每个注释......