问题
As you can see in the image below that all annotations have same image
and discount
which is not correct, they should have different image
and discount
. How can I fix this? I am using a custom annotation class with discountStr
and 'imgPathStr' property and the following code.
-(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];
}
Delegate method:
- (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;
}
回答1:
This is a common mistake with map views. The important thing to know is that viewForAnnotation
is called independently of the connectionDidFinishLoading
method in which you are making your annotations. viewForAnnotation
is called when iOS decides it needs it in the order it decides. That's why one of the parameters is the annotation it needs to draw. In your code you are calculating the every adDiscount
label based on anno
which is the last item in your loop. Instead you should be using annotation
回答2:
just add this bellow line inside the for loop ..
[searchMapView addAnnotation: anno];
comment this bellow line..
[searchMapView addAnnotations:annoArray];
See Example bellow..
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];
}
来源:https://stackoverflow.com/questions/16292462/custom-annotations-with-same-image