MKPinAnnotationView颜色不起作用

我试图从数组中显示一些引脚,显示它们,但是它们是红色的,而不是绿色的,因为我要求它们是。

这是为什么 ?

//run on array to get all locations for(int k=0;k<[array count];k=k+2) { float targetlat=[[array objectAtIndex:k] floatValue]; float targetlongi=[[array objectAtIndex:k+1] floatValue]; CLLocationCoordinate2D location = CLLocationCoordinate2DMake(targetlat,targetlongi); NSString *partyTitle = @"title"; MKPinAnnotationView *partyPin = [self returnPointView:location andTitle:partyTitle andColor:MKPinAnnotationColorGreen]; [self.mapView addAnnotation:partyPin.annotation]; } //function callback is working but its red, and it takes so much time to load -(MKPinAnnotationView*) returnPointView: (CLLocationCoordinate2D) location andTitle: (NSString*) title andColor: (int) color { MKCoordinateRegion region = self.mapView.region; region.center = location; region.span.longitudeDelta /= 5.0; region.span.latitudeDelta /= 5.0; [self.mapView setRegion:region]; MKPointAnnotation *resultPin = [[MKPointAnnotation alloc] init]; MKPinAnnotationView *result = [[MKPinAnnotationView alloc] initWithAnnotation:resultPin reuseIdentifier:Nil]; [resultPin setCoordinate:location]; resultPin.title = title; result.pinColor = color; return result; } 

关于引脚是红色而不是绿色的主要问题:

代码创build一个MKPinAnnotationView但是这个视图永远不会被赋予地图视图
要使地图视图使用您创build的注释视图, 您必须实现viewForAnnotation委托方法并从那里返回它们
否则,地图视图不知道您创build的注释视图。
如果您没有实现viewForAnnotation ,则地图视图会创build一个默认的红色视图。

关于第二个“需要花费很多时间”的问题:

最可能的原因是每次添加注释时调用setRegion
如果您要添加500个注释,则地图视图会将该区域设置为500次。
请注意, 没有必要调用setRegion只是添加一个注释 (不pipe当前可见的区域)。 注释的坐标不一定是“可见的”在那里添加注释。

你想在for循环中做什么只是构造一个包含所有注释的区域,然后所有注释被添加(在for循环之后)之后调用setRegion (或setVisibleRect )。 构造一个MKMapRect并调用setVisibleMapRect比构造一个MKCoordinateRegion来调用setRegion更容易。

在iOS 7中,这更简单:只需调用showAnnotations (不需要手动构build)。

例:

 //Initialize the MKMapRect (region) we want to show to null... MKMapRect showMapRect = MKMapRectNull; for(int k=0;k<[array count];k=k+2) { float targetlat=[[array objectAtIndex:k] floatValue]; float targetlongi=[[array objectAtIndex:k+1] floatValue]; CLLocationCoordinate2D location = CLLocationCoordinate2DMake(targetlat,targetlongi); NSString *partyTitle = @"title"; //Here, don't create the annotation view. //Just create the annotation... MKPointAnnotation *resultPin = [[MKPointAnnotation alloc] init]; [resultPin setCoordinate:location]; resultPin.title = partyTitle; [self.mapView addAnnotation:resultPin]; //Add this annotation's coordinate //to the MKMapRect we want to show... MKMapPoint annMapPoint = MKMapPointForCoordinate(location); MKMapRect annMapRect = MKMapRectMake(annMapPoint.x, annMapPoint.y, 0, 0); showMapRect = MKMapRectUnion(showMapRect, annMapRect); } mapView.visibleMapRect = showMapRect; //In iOS 7, instead of constructing MKMapRect manually, //we could just call showAnnotations... //[mapView showAnnotations:mapView.annotations animated:YES]; //Implement the viewForAnnotation delegate method... -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { //if annotation is the user location, //return nil so map view shows default view for it (blue dot)... if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } static NSString *reuseId = @"pin"; MKPinAnnotationView *pav = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; if (pav == nil) { pav = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId]; pav.canShowCallout = YES; pav.animatesDrop = YES; pav.pinColor = MKPinAnnotationColorGreen; } else { pav.annotation = annotation; } return pav; }