Why does a custom MKMapView annotation image disap

2020-02-11 04:32发布

问题:

I am annotating my map and setting an image just fine, but when I tap the annotation on the MapView, the image goes from my custom image back to the red pin. Why is this?

- (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id )newAnnotation {
    MKPinAnnotationView *annotation = [[MKPinAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"];
    if (annotation == nil) {
        annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"];
    }

    annotation.image = [UIImage imageNamed:@"anno.png"];
    annotation.canShowCallout = YES;
    annotation.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bus_stop_30x30.png"]];
    annotation.leftCalloutAccessoryView = imgView;

    return annotation;
}

My code looks identical to some sample code that does not produce this problem.

回答1:

Answering my own question here, just in case others have the same issue. Notice that I am using "MKPinAnnotationView" - it should be changed to "MKAnnotationView" and everything works.

Fixed code:

- (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id )newAnnotation {
    MKAnnotationView *annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"];

    if (annotation == nil) {
        annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"];
    }

    annotation.image = [UIImage imageNamed:@"anno.png"];
    annotation.canShowCallout = YES;
    annotation.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bus_stop_30x30.png"]];
    annotation.leftCalloutAccessoryView = imgView;

    return annotation;
}


回答2:

I think this is one of the best ways:

(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
    NSLog(@"welcome into the map view annotation");
    MyAnnotation* myAnnotation1=annotation;

    // if it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

    if([mapView isEqual:mapMainView]== NO)
    {
        return  nil;
    }
    // try to dequeue an existing pin view first
    //  if ([annotation isKindOfClass:[myAnnotation1 class]]) 
    //  {

    // try to dequeue an existing pin view first
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";

    MKPinAnnotationView* pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];

    if (nil == pinView)
    {
        MKAnnotationView* annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation

        reuseIdentifier:AnnotationIdentifier] autorelease];
        // annotationView.canShowCallout = YES;
        // pinView.animatesDrop=YES;
        //pinView.pinColor=MKPinAnnotationColorPurple;

        //image
        UIImage* flagImage = [UIImage imageNamed:@"map_marker_over2.png"];

        CGRect resizeRect;

        resizeRect.size = flagImage.size;
        CGSize maxSize = CGRectInset(self.view.bounds,
        [MapPropertyViewController annotationPadding],
        [MapPropertyViewController annotationPadding]).size;
        maxSize.height -= self.navigationController.navigationBar.frame.size.height + [MapPropertyViewController calloutHeight];
        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 = (CGPoint){0.0f, 0.0f};
        UIGraphicsBeginImageContext(resizeRect.size);
        [flagImage drawInRect:resizeRect];
        UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        annotationView.image = resizedImage;
        annotationView.opaque = NO;

        UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton setTitle:annotation.title forState:UIControlStateNormal];
        [rightButton addTarget:self
        action:@selector(showDetails:)
        forControlEvents:UIControlEventTouchUpInside];
        rightButton.tag = myAnnotation1.tagAnnotation;
        annotationView.rightCalloutAccessoryView = rightButton;

        profileIconView = [[UIImageView alloc]initWithFrame:CGRectMake(18.5f, 10.0f, 37.0f, 30.0f)];
        annotationView.leftCalloutAccessoryView = profileIconView;
        //image
        img = [UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:[arrImages objectAtIndex:myAnnotation1.tagAnnotation]]]];
        NSLog(@"Annotation Click %d",[arrImages count]);
        NSLog(@"image  %@",img);
        profileIconView.image=img;

        [profileIconView release];

        [annotationView setEnabled:YES];
        [annotationView setCanShowCallout:YES];
        return annotationView;
    }   
    return pinView;
    //  }
    //  return nil;
}


回答3:

    Try this if you want to set both Source to Destination pin images different.

    MKPointAnnotation * sourceAnno= [[MKPointAnnotation alloc] init];
    sourceAnno.coordinate=CLLocationCoordinate2DMake(YourSourcelatitude,YourSourcelongitude);
    [sourceAnno setAccessibilityLabel:@“Source”];
    sourceAnno.title = @“You”;
    [mapview addAnnotation: sourceAnno];

    DestinationAnno = [[MKPointAnnotation alloc] init];
    DestinationAnno.coordinate = CLLocationCoordinate2DMake(YourDestinationlatitude,YourDestinationlongitude);
    [DestinationAnno setAccessibilityLabel:@“Destination”];
    DestinationAnno.title =@“Destination”;
    [mapview addAnnotation: DestinationAnno];

   In Delegate Method
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{
    MKPointAnnotation *PointAnno=(MKPointAnnotation *)annotation;
    NSString * kPinAnnotationIdentifier = PointAnno.accessibilityLabel;
    MKAnnotationView *AnnotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation    reuseIdentifier:kPinAnnotationIdentifier];

    if ([kPinAnnotationIdentifier isEqualToString:@"Source"]) 
   {
        AnnotationView.centerOffset = CGPointMake(8, -14);
        AnnotationView.calloutOffset = CGPointMake(-8, 0);
        AnnotationView.image = [UIImage imageNamed:@"pin_blue.png"];
        AnnotationView.canShowCallout = YES;
    }
    else if([kPinAnnotationIdentifier isEqualToString:@"Destination"])
    {
        AnnotationView.centerOffset = CGPointMake(8, -14);
        AnnotationView.calloutOffset = CGPointMake(-8, 0);
        AnnotationView.image = [UIImage imageNamed:@"pin_red.png"];
        AnnotationView.canShowCallout = YES;
    }
    return AnnotationView;
}

Thank you