Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

My Custom MKAnnotationView isn't clickable

i'm working on a custom annotationview that show a image of background, with inside a custom image. I've based my code from this: Custom MKAnnotationView with frame,icon and image And my actually code is:

    else if ([annotation isKindOfClass:[ImagePin class]]){
       static NSString *identifierImage = @"ImagePinLocation";
        MKAnnotationView *annotationImageView = (MKAnnotationView *) [self.mapView dequeueReusableAnnotationViewWithIdentifier:identifierImage];
       if(annotationImageView){
         return annotationImageView;
       }
       else {
            annotationImageView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifierImage];
            annotationImageView.canShowCallout = YES;

            annotationImageView.image = [UIImage imageNamed:@"image_bg_mappa"];

            UIImage *frame = [UIImage imageNamed:@"image_bg_mappa"];
            ImagePin *imagePinImage = annotation;
            NSLog(@"%@", [NSString stringWithFormat:@"%@", imagePinImage.image]);


            NSString *urlStringForImage = [NSString stringWithFormat:@"%@", imagePinImage.image];
            NSURL *urlForImage = [NSURL URLWithString:urlStringForImage];
            UIImageView *imageView = [[UIImageView alloc] init];

            [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", urlForImage]] placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]];

            UIGraphicsBeginImageContext(CGSizeMake(annotationImageView.image.size.width, annotationImageView.image.size.height));

            [frame drawInRect:CGRectMake(0, 0, frame.size.width, frame.size.height)];
            [imageView.image drawInRect:CGRectMake(2, 2, 48, 38)]; // the frame your inner image

            annotationImageView.image = UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();

            UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            [rightButton addTarget:self action:@selector(writeSomething:) forControlEvents:UIControlEventTouchUpInside];
            [rightButton setTitle:@"" forState:UIControlStateNormal];
            annotationImageView.canShowCallout = YES;
            annotationImageView.rightCalloutAccessoryView = rightButton;
            annotationImageView.enabled = YES;
        return annotationImageView;
        }
    }

And then i have two method:

(void)writeSomething {        
}

(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {    
}

But:

  1. Not show my rightButton callout(not show also the button)
  2. I prefer that when i click on the full image/annotation it call mapView annotationView method.

How i can do it ? Why when i click on annotation, it not call my calloutAccessoryControlTapped method ? In this map i have also more different type of pin(mkpinannotation), and works fine(also the method calloutAccessoryControlTapped works fine with these pins). Where is the problem ? Thanks to all, and sorry for my bad english(I'm learning it).

EDIT: My full code for viewForAnnotation method: https://gist.github.com/anonymous/6224519e308d6bf56c4c The MKPinAnnotation works fine.

EDIT: This is my ImagePin.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface ImagePin : NSObject <MKAnnotation>

- (id)initWithImage:(NSString*)image imagebeachId:(NSString*)imagebeachId coordinate:(CLLocationCoordinate2D)coordinate;
//- (MKMapItem*)mapItem;
@property (nonatomic, copy) NSString *imagebeachId;
@property (nonatomic, copy) NSString *image;
@property (nonatomic, assign) CLLocationCoordinate2D theCoordinate;
@end

And my ImagePin.m

#import "ImagePin.h"
#import <AddressBook/AddressBook.h>

@interface ImagePin ()

@end

@implementation ImagePin
@synthesize image = _image;
@synthesize imagebeachId = _imagebeachId;
@synthesize theCoordinate = _theCoordinate;

- (id)initWithImage:(NSString*)image imagebeachId:(NSString*)imagebeachId coordinate:(CLLocationCoordinate2D)coordinate {
    if ((self = [super init])) {
        //self.address = address;
        self.image = image;
        self.imagebeachId = imagebeachId;
        self.theCoordinate = coordinate;
    }
    return self;
}
- (NSString *)title {
    return @"";
}
- (NSString *)subtitle {
    return _image;
}

- (CLLocationCoordinate2D)coordinate {
    return _theCoordinate;
}
@end

EDIT: This is where i add annotation:

- (void)imagePositions:(NSDictionary *)responseData {
    for (id<MKAnnotation> annotation in self.mapView.annotations) {
        if ([annotation isKindOfClass:[ImagePin class]]){
            //[self.mapView removeAnnotation:annotation];
        }
    }

    for (NSArray *row in responseData) {
        NSString * imageBeachId = [row valueForKey:@"id"];

        NSNumber * latitude = [row valueForKey:@"lat"];


        NSNumber * longitude = [row valueForKey:@"lng"];
        NSString * imageBeach = [row valueForKey:@"fb_photo_url"];


        CLLocationCoordinate2D coordinate;
        coordinate.latitude = latitude.doubleValue;
        coordinate.longitude = longitude.doubleValue;
        ImagePin *annotation = [[ImagePin alloc] initWithImage:imageBeach imagebeachId:imageBeachId coordinate:coordinate];

        [self.mapView addAnnotation:annotation];
    }
}
like image 904
Riccardo Rossi Avatar asked Jul 17 '13 11:07

Riccardo Rossi


2 Answers

I have fixed all! The problem is that title can't be empty(i was using @""... with a @"AAA works fine) and then for not show the callout i have done:

annotationView.canShowCallout = NO;

and implemented:

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    //here you action
}

A BIG thanks to Anna(the solution is your)!

like image 192
Riccardo Rossi Avatar answered Nov 09 '22 03:11

Riccardo Rossi


First checkout that you give the delegate to MapView or not , if not then give the delegate like bellow..

yourMapView.delegate = self;

Also in .h file define that delegate like bellow..

@interface ViewController : UIViewController<MKMapViewDelegate,MKAnnotation>{...

after check that this bellow method called when accessory tapped...

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"Do something ");
}

UPDATE:

Instead of Custom Button try to use it...

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    NSLog(@"viewForAnnotation...");

    static NSString *identifier = @"MyLocation";
    if ([annotation isKindOfClass:[ImagePin class]]) {

        MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

        if (annotationView == nil)
        {
            annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
        }

        if (annotation == mapView.userLocation)
            return nil;

        annotationView.image = [UIImage imageNamed:@"yourImageName.png"];
        annotationView.annotation = annotation;
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annotationView.rightCalloutAccessoryView.tag = 101;

        annotationView.canShowCallout = YES;
        //  annotationView.animatesDrop = YES;
        return annotationView;
    }

    return nil;
}
like image 24
Paras Joshi Avatar answered Nov 09 '22 02:11

Paras Joshi