可以在MKMapView上绘制的最大注释数(MKAnnotation)?

时间:2012-04-13 18:04:04

标签: iphone objective-c ios mkmapview mkannotation

我想在mapview上添加一些注释(arround 500),但它似乎显示的最大值为100.如果我超过100,则不会调用 viewForAnnotation 委托方法。但它适用于100以下的注释。

这里是代码:(仅当 annotationArray 数组的数量小于101时才有效)

_allPoints = [[NSMutableArray alloc] init];

NSString* responseFile = [[NSBundle mainBundle] pathForResource:@"Datafile" ofType:@"txt"];
NSData *sampleData = [NSData dataWithContentsOfFile:responseFile];  
if (sampleData) {  
    NSError* error;
    NSDictionary* json = [NSJSONSerialization 
                          JSONObjectWithData:sampleData

                          options:kNilOptions 
                          error:&error];

    NSArray* response = [json objectForKey:@"response"];
    for (NSDictionary *lineDict in response) {
        if ([[lineDict objectForKey:@"data"] isKindOfClass:[NSArray class]]) {
            SinglePoint *singlePoint = [[SinglePoint alloc] initWithDictionary:lineDict];
            [_allPoints addObject:singlePoint];
        }
        else {
            NSLog(@"Error");
        }
    }
}  


_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[_mapView setDelegate:self];
[self.view addSubview:_mapView];

NSMutableArray *annotationArray = [[NSMutableArray alloc] init];
for (int i=0; i<[_allPoints count]; i++) {
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i];
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView];
    [annotationArray addObject:annotation];
}
[_mapView addAnnotations:(NSArray *)annotationArray];

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 };
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO];

委托方法是:

编辑:根据评论,开始重复使用该视图,但没有运气:(

if ([annotation isKindOfClass:[NVPolylineAnnotation class]]) {
    static NSString *viewIdentifier = @"annotationView";
    NVPolylineAnnotationView *annotationView = (NVPolylineAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier];
    if (annotationView == nil) {
        annotationView = [[NVPolylineAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewIdentifier mapView:_mapView];
    }
    return annotationView;
}
return nil;

我在文档或其他任何地方都找不到任何限制。这可能是记忆问题吗?

3 个答案:

答案 0 :(得分:1)

MKMapView并非限制annotationViews。但它在一定数量的视图(+1000)之上变得非常迟缓且无法使用。

我相信,这样做的原因是你完全错误地处理annotationView管理。即使您使用ARC,也不应为每个注释创建唯一视图。您应该重用每个未使用的视图,例如UITableView的单元格。

有一些很好的教程,如Introduction to MapKit on iOS - Ray Wenderlich

如果这不能解决您的问题,您应该尝试调试注释类。 (NVPolylineAnnotationNVPolylineAnnotationView)。也许有些不对劲。 您是否也检查过您的点数组是否有相等的坐标?

答案 1 :(得分:1)

最后能够追查问题。通过先设置mapView的中心然后再添加注释来解决它。我仍然不知道为什么之前会显示100个注释(为什么只有100个注释)。谢谢大家的建议和时间。

这是我改变的代码: -

_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[_mapView setDelegate:self];
[self.view addSubview:_mapView];

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 };
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO];

NSMutableArray *annotationArray = [[NSMutableArray alloc] init];
for (int i=0; i<[_allPoints count]; i++) {
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i];
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView];
    [annotationArray addObject:annotation];
}
[_mapView addAnnotations:(NSArray *)annotationArray];

答案 2 :(得分:0)

您可以根据需要添加任意数量的注释。但是,在注释的coordinate属性与地图视图的可见部分相交之前,不会创建每个注记的视图。 MapKit不会因为您向地图添加注释而创建视图。