MKMapView一次加载所有注释视图(包括那些在当前rect之外的视图)

jma*_*ans 13 iphone cocoa-touch google-maps objective-c ipod-touch

UPDATE

看起来这个问题已经在iOS 4.3中得到了悄悄修复.到目前为止,被认为"足够远"以便注释被回收的距离似乎是数百英里,即使在非常接近地放大时也是如此.当我使用iOS 4.3 SDK构建我的应用程序时,注释会根据更合理的限制进行回收.


有没有其他人遇到这个问题?这是代码:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(WWMapAnnotation *)annotation {



// Only return an Annotation view for the placemarks. Ignore for the current location--the iPhone SDK will place a blue ball there.

NSLog(@"Request for annotation view");

if ([annotation isKindOfClass:[WWMapAnnotation class]]){



    MKPinAnnotationView *browse_map_annot_view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"BrowseMapAnnot"];



    if (!browse_map_annot_view) {
        browse_map_annot_view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"BrowseMapAnnot"] autorelease];
        NSLog(@"Creating new annotation view");
    } else {
        NSLog(@"Recycling annotation view");
        browse_map_annot_view.annotation = annotation;
    }
Run Code Online (Sandbox Code Playgroud)

...

一旦显示视图,我就会得到

2009-08-05 13:12:03.332 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
Run Code Online (Sandbox Code Playgroud)

对于我添加的每个注释(~60).地图(正确)仅显示当前矩形中的两个注释.我在viewDidLoad中设置区域:

if (center_point.latitude == 0) {
    center_point.latitude = 35.785098;
    center_point.longitude = -78.669899;
}

if (map_span.latitudeDelta == 0) {
    map_span.latitudeDelta = .001;
    map_span.longitudeDelta = .001;
}

map_region.center = center_point;
map_region.span = map_span;

NSLog(@"Setting initial map center and region");

[browse_map_view setRegion:map_region animated:NO];
Run Code Online (Sandbox Code Playgroud)

在请求任何注释视图之前,将设置区域的日志条目打印到控制台.

这里的问题是,由于所有注释都是一次请求的,[mapView dequeueReusableAnnotationViewWithIdentifier]什么都不做,因为地图上的每个注释都有唯一的MKAnnotationViews.这导致了我的记忆问题.

一个可能的问题是这些注释聚集在一个非常小的空间(半径约1英里).虽然地图在viewDidLoad(纬度和经度增量.001)中放大得非常紧,但它仍然会一次加载所有注释视图.

谢谢...

yon*_*nel 14

您期望的是基于当前__CODE__地图显示的注释视图的某种"剪裁" .

这不是__CODE__选择器的工作方式.

从其文档中: 随着注释视图在屏幕外移动,地图视图将它们移动到内部管理的重用队列.随着新注释在屏幕上移动,并且提示您的代码提供相应的注释视图,您应始终尝试在创建新视图之前使其出列.

因此,当您调用如下序列时,可重用机制才有意义:__CODE__方法,以便在该区域发生变化时获得通知

  • 遍历所有对象以获得与此区域匹配的对象
  • addAnnotations只对那些对象添加到地图中(您可以在先前显示的注释和新注释之间实现一种合并,或者只是从头开始重新启动,删除所有注释,并设置新注释)
  • 当然,当用户缩小很多并且该区域的范围太大(要显示的引脚太多)时,您必须做出决定:我是否显示了所有注释视图(并承担风险)地图上的显示没有提供太多信息)或者我是否向用户设置了"放大以获取引脚"或其他内容的消息.但这是另一个故事...;)