0
votes

I am adding 2 annotations in mapview with leftcalloutaccessoryview (with an image) and rightcalloutacessoryview (with detail disclosure button). The problem is that it is working fine but only for one annotation, not for both. It shows one annotation with image and detail disclosure button that can be tapped while second annotation shows only title, no image and no detail disclosure button and it can not be tapped. Here is my code.

-(void)viewDidLoad{

 [super viewDidLoad];

 myLocationManager=[[CLLocationManager alloc] init];
 geocoder = [[CLGeocoder alloc] init];

myLocationManager.delegate=self;
myLocationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
myLocationManager.distanceFilter=10.0;
[myLocationManager startUpdatingLocation];    

mapView = [[MKMapView alloc]initWithFrame:
           CGRectMake(10, 255, 300, 205)];
mapView.delegate = self;    
mapView.centerCoordinate = CLLocationCoordinate2DMake(37.32, -122.03);    
mapView.mapType = MKMapTypeStandard; 

[self startAddingAnnottaions];

[self.view addSubview:mapView];
}

//startAddingAnnotations now

-(void)startAddingAnnottaions{

//first annotation
CLLocationCoordinate2D location;
location.latitude = (double) 37.331768;
location.longitude = (double) -122.020039;
MapAnnotation *newAnnotation = [[MapAnnotation alloc]
                                initWithTitle:@"Apple Head quaters" subtitle:@"subtitle" andCoordinate:location];
[mapView addAnnotation:newAnnotation];

//second annotation
CLLocationCoordinate2D location2;
location2.latitude = (double) 37.35239;
location2.longitude = (double) -122.025919;
MapAnnotation *newAnnotation2 = [[MapAnnotation alloc]
                                 initWithTitle:@"Test Annotation" subtitle:@"parse"  andCoordinate:location2];
[mapView addAnnotation:newAnnotation2];
}

//didAddAnnotationViews

- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views
{
 MKAnnotationView *annotationView = [views objectAtIndex:0];
 id <MKAnnotation> mapPoint = [annotationView annotation];

annotationView.canShowCallout = YES;
annotationView.calloutOffset = CGPointMake(0, 32);

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
annotationView.rightCalloutAccessoryView = rightButton;

UIImageView *iconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"orageSquare.png"]];
annotationView.leftCalloutAccessoryView = iconView;

MKCoordinateRegion region; 
region.center = [mapPoint coordinate];  
 MKCoordinateSpan span; 
 span.latitudeDelta = 0.0144927536;  //  0.0144927536 is equivalent to 1 mile
 span.longitudeDelta = 0.0144927536;  
 region.span = span; 

 [mv setRegion:region animated:YES];
 [mv selectAnnotation:mapPoint animated:YES]; 

}

//callout Accessory Control Tapped

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
id <MKAnnotation> annotation = [view annotation];

NSLog(@"Right Button Pressed");
[self performSegueWithIdentifier:@"mapToOtherInfo" sender:self];
}

What am I doing wrong? It should show multiple annotations with image and detail disclosure button. Why is it showing only one annotation with them? sometimes first one works fine, sometimes second one does but both don't work fine together.

1

1 Answers

0
votes

You should set leftCalloutAccessoryView and rightCalloutAccessoryView property in viewForAnnotation method, not didAddAnnotationViews. Then you can show both annotation.

enter image description here

example:

- (MKAnnotationView *)mapView:(MKMapView*)mapView
        viewForAnnotation:(id <MKAnnotation>)annotation
{
    if (annotation == mapView.userLocation) {
        return nil;
    }

    MKPinAnnotationView *annotationView;
    NSString *identifier = @"Pin";
    annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (nil == annotationView) {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    }

    UIImageView *iconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"frame_blue.png"]];
    annotationView.leftCalloutAccessoryView = iconView;

    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return annotaionView;
}