5

我想在地图视图上添加一些注释(大约 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;

我在文档或其他任何地方都找不到任何限制。会不会是内存问题?

4

3 回答 3

1

MKMapView没有annotationViews限制。但在一定数量的视图(+1000)之上,它变得相当滞后且无法使用。

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

有几个很好的教程,比如iOS 上的 MapKit 简介 - Ray Wenderlich

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

于 2012-04-13T18:44:42.237 回答
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];
于 2012-04-14T13:36:37.480 回答
0

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

于 2012-04-13T18:53:28.843 回答