我正在研究显示背景图像的自定义注释视图,其中包含自定义图像。我的代码基于:Custom MKAnnotationView with frame,icon and image 而我的实际代码是:
    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;
        }
    }
然后我有两种方法:
(void)writeSomething {        
}
(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {    
}
但:
- 不显示我的 rightButton 标注(不显示按钮)
 - 我更喜欢当我点击完整的图像/注释时,它会调用 mapView annotationView 方法。
 
我该怎么做?为什么当我点击注释时,它没有调用我的 calloutAccessoryControlTapped 方法?在这张地图中,我还有更多不同类型的引脚(mkpinannotation),并且工作正常(calloutAccessoryControlTapped 方法也适用于这些引脚)。问题出在哪里 ?谢谢大家,很抱歉我的英语不好(我正在学习它)。
编辑:我的 viewForAnnotation 方法的完整代码:https ://gist.github.com/anonymous/6224519e308d6bf56c4c MKPinAnnotation 工作正常。
编辑: 这是我的 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
还有我的 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
编辑: 这是我添加注释的地方:
- (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];
    }
}