Custom annotations with same image

2019-08-08 14:47发布

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. enter image description here

-(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;

}

2条回答
小情绪 Triste *
2楼-- · 2019-08-08 15:30

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];
    }
查看更多
ら.Afraid
3楼-- · 2019-08-08 15:46

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

查看更多
登录 后发表回答