有什么方法可以重置dequeueReusableAnnotationViewWithIdentifier中使用的队列吗?

我在mapview中添加自定义注释。 基于应用程序的内部模型,注释可以改变颜色和标题(尽pipe位置可能不会改变)。 我在方法中使用dequeueReusableAnnotationViewWithIdentifier

 - (MKAnnotationView *)mapView:(MKMapView *) viewForAnnotation:(id <MKAnnotation>) 

奇怪的是,当模型改变时,注解被“刷新”以使用正确的标题和颜色(我只是使用removeAnnotations:并添加新的),但是随后在使用地图时,一些错误颜色的旧注释被取消。 每次模型更改时,我都使用不同的标识符。

这里是代码:

 - (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation{ // in case it's the user location, we already have an annotation, so just return nil if ([annotation isKindOfClass:[MKUserLocation class]]){ return nil; } if ([annotation isKindOfClass:[APGSAnnotation class]]){ APGSAnnotation *gsn = (APGSAnnotation*) annotation; NSString *GSAnnotationIdentifier = [NSString stringWithFormat:@"gid_%lu_%@", (unsigned long)gsn.gs.gID, self.car.energyType]; MKAnnotationView *markerView = [theMapView dequeueReusableAnnotationViewWithIdentifier:GSAnnotationIdentifier]; if (markerView == nil) { MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:GSAnnotationIdentifier]; annotationView.canShowCallout = YES; annotationView.image = [self customizeAnnotationImage:gsn.gs]; annotationView.opaque = NO; UIImageView *sfIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:gsn.logo]]; annotationView.leftCalloutAccessoryView = sfIconView; // http://stackoverflow.com/questions/8165262/mkannotation-image-offset-with-custom-pin-image annotationView.centerOffset = CGPointMake(0,-annotationView.image.size.height/2); UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [rightButton addTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside]; annotationView.rightCalloutAccessoryView = rightButton; return annotationView; }else{ markerView.annotation = annotation; return markerView; } } return nil; } 

和定制方法

 - (UIImage*)customizeAnnotationImage:(APGS*)gs{ UIImage *markerImage; if (gs.gID == self.best.gID) { markerImage = [UIImage imageNamed:@"marker_red.png"]; }else if (gs.type == k1){ markerImage = [UIImage imageNamed:@"marker_blue.png"]; }else if (gs.type == k2){ markerImage = [UIImage imageNamed:@"marker_green.png"]; }else if (gs.type == k3){ markerImage = [UIImage imageNamed:@"marker_purple.png"]; }else if (gs.type == k4){ markerImage = [UIImage imageNamed:@"marker_brown.png"]; } UIImage *logoImage = [UIImage imageNamed:gs.logo]; // size the flag down to the appropriate size CGRect resizeRect; resizeRect.size = markerImage.size; CGSize maxSize = CGRectInset(self.view.bounds, kAnnotationPadding, kAnnotationPadding).size; maxSize.height -= self.navigationController.navigationBar.frame.size.height + kCallOutHeight; if (resizeRect.size.width > maxSize.width) resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width); if (resizeRect.size.height > maxSize.height) resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height); resizeRect.origin = CGPointMake(0.0, 0.0); float initialWidth = resizeRect.size.width; UIGraphicsBeginImageContextWithOptions(resizeRect.size, NO, 0.0f); [markerImage drawInRect:resizeRect]; resizeRect.size.width = resizeRect.size.width/2; resizeRect.size.height = resizeRect.size.height/2; resizeRect.origin.x = resizeRect.origin.x + (initialWidth - resizeRect.size.width)/2; resizeRect.origin.y = resizeRect.origin.y + kLogoHeightPadding; [logoImage drawInRect:resizeRect]; // Create string drawing context UIFont *font = [UIFont fontWithName:@"DBLCDTempBlack" size:11.2]; NSString * num = [NSString stringWithFormat:@"%4.3f",[gs getL]]; NSDictionary *textAttributes = @{NSFontAttributeName: font, NSForegroundColorAttributeName: [UIColor whiteColor]}; CGSize textSize = [num sizeWithAttributes:textAttributes]; NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init]; //adjust center if (resizeRect.size.width - textSize.width > 0) { resizeRect.origin.x += (resizeRect.size.width - textSize.width)/2; }else{ resizeRect.origin.x -= (resizeRect.size.width - textSize.width)/2; } resizeRect.origin.y -= kTextPadding; [num drawWithRect:resizeRect options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttributes context:drawingContext]; UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resizedImage; } 

基于车型,注释应该改变颜色。

基于标题,答案是否:)

通常情况下,您将使视图出列并重置视图的所有相关属性

解决方法:

你可以考虑的是:如果视图变化太大,你可以切换到一个不同的reusingIdentifier,从而切换队列和“绕过”caching的视图