我想在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;
我在文档或其他任何地方都找不到任何限制。这可能是记忆问题吗?
答案 0 :(得分:1)
MKMapView
并非限制annotationViews
。但它在一定数量的视图(+1000)之上变得非常迟缓且无法使用。
我相信,这样做的原因是你完全错误地处理annotationView
管理。即使您使用ARC,也不应为每个注释创建唯一视图。您应该重用每个未使用的视图,例如UITableView
的单元格。
有一些很好的教程,如Introduction to MapKit on iOS - Ray Wenderlich。
如果这不能解决您的问题,您应该尝试调试注释类。 (NVPolylineAnnotation
和NVPolylineAnnotationView
)。也许有些不对劲。
您是否也检查过您的点数组是否有相等的坐标?
答案 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不会因为您向地图添加注释而创建视图。