自定义注释与相同的图像

正如您在下面的图片中看到的,所有注释具有相同的imagediscount ,这是不正确的,他们应该有不同的imagediscount 。 我怎样才能解决这个问题? 我正在使用一个自定义注释类与discountStr和'imgPathStr'属性和下面的代码。 在这里输入图像说明

 -(void) connectionDidFinishLoading: (NSURLConnection *) connection { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; _adResultDict = [NSJSONSerialization JSONObjectWithData:_adResultData options:kNilOptions error:nil]; NSMutableArray *annoArray = [[NSMutableArray alloc]init]; NSArray *adArray = [[_adResultDict objectForKey:@"result"]objectForKey:@"ads"]; for (int i = 0; i<adArray.count;i++ ) { NSString *latLongStr = [[adArray objectAtIndex:i]objectForKey:@"area_lat_long"]; NSArray *tempLatLongArray =[ latLongStr componentsSeparatedByString:@","]; CLLocationCoordinate2D adPlace; adPlace.latitude = [[tempLatLongArray objectAtIndex:0] doubleValue]; adPlace.longitude = [[tempLatLongArray objectAtIndex:1]doubleValue]; anno = [[Annotation alloc]init]; anno.title = [[adArray objectAtIndex:i]objectForKey:@"ad_title"]; anno.adDiscountStr = [[adArray objectAtIndex:i]objectForKey:@"discount"]; anno.adPurposeStr = [[adArray objectAtIndex:i]objectForKey:@"ad_tab"]; anno.adImagePathStr = [[adArray objectAtIndex:i]objectForKey:@"image_name"]; anno.coordinate = adPlace; [annoArray addObject:anno]; } [searchMapView addAnnotations:annoArray]; [searchMapView reloadInputViews]; } 

代表方法:

  - (MKAnnotationView *) mapView:(MKMapView *)mapView1 viewForAnnotation:(id <MKAnnotation>) annotation { MKAnnotationView *pinView = nil; if(annotation != mapView1.userLocation) { static NSString *defaultPinID = @"com.invasivecode.pin"; pinView = (MKAnnotationView *)[mapView1 dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; if ( pinView == nil ) pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; //pinView.pinColor = MKPinAnnotationColorGreen; pinView.canShowCallout = YES; //pinView.animatesDrop = YES; UIImageView *adImageView = [[UIImageView alloc]initWithFrame:CGRectMake(8, 8, 69, 61)]; adImageView.contentMode =UIViewContentModeScaleToFill; pinView.centerOffset = CGPointMake(0, -45); adImageView.backgroundColor =[UIColor clearColor]; CALayer * l = [adImageView layer]; [l setMasksToBounds:YES]; [l setCornerRadius:7.0]; UIImageView *adDiscountImageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, -20, 75, 35)]; adDiscountImageView.image = [UIImage imageNamed:@"map-price-tag"]; UILabel *adDiscountLabel = [[UILabel alloc]initWithFrame:CGRectMake(12, 8, 40, 20)]; //adDiscountLabel.center = adDiscountImageView.center; if ([anno.adDiscountStr isEqualToString:@""] ||[anno.adDiscountStr isEqualToString:@"0"]) { adDiscountLabel.text = anno.adPurposeStr; } adDiscountLabel.text = [NSString stringWithFormat:@"%@%%",anno.adDiscountStr]; adDiscountLabel.backgroundColor =[UIColor clearColor]; adDiscountLabel.textColor = [UIColor whiteColor]; pinView.image = [UIImage imageNamed:@"map-pop-up.png"]; [pinView addSubview:adImageView]; [pinView addSubview:adDiscountImageView]; [adDiscountImageView addSubview:adDiscountLabel]; // } else { [mapView1.userLocation setTitle:@"Current Location"]; } return pinView; } 

这是地图视图常见的错误。 要知道的重要的事情是, viewForAnnotation独立于您在做注释的connectionDidFinishLoading方法。 viewForAnnotation是在iOS决定需要的时候调用的。 这就是为什么其中一个参数是需要绘制的注释。 在你的代码中,你正在计算每个 adDiscount标签基于anno这是你的循环中的最后一个项目。 相反,你应该使用annotation

只要在for循环中添加这个波纹线即可

 [searchMapView addAnnotation: anno]; 

评论这个波纹线..

 [searchMapView addAnnotations:annoArray]; 

见下面的示例

  for (int i = 0; i<[arrJourneyData count]; i++) { MyAnnotation *annTemp=[[MyAnnotation alloc]init]; CLLocationCoordinate2D CLLTemp; objectAtIndex:i] floatValue],[[[arrJourneyData valueForKey:@"journeylong"] objectAtIndex:i] floatValue]); CLLTemp.latitude = [[[arrJourneyData valueForKey:@"journeylat"] objectAtIndex:i] floatValue]; CLLTemp.longitude = [[[arrJourneyData valueForKey:@"journeylong"] objectAtIndex:i] floatValue]; annTemp.coordinate = CLLTemp; annTemp.title = [NSString stringWithFormat:@"%d Image of %@",totalrecord,[appDelegate getAddressFromLatLon:[[[arrJourneyData valueForKey:@"journeylat"] objectAtIndex:i] floatValue] withLongitude:[[[arrJourneyData valueForKey:@"journeylong"] objectAtIndex:i] floatValue]]]; annTemp.anntag = i; [mapView addAnnotation:annTemp]; [annTemp release]; }