MKAnnotation的自定义图像

时间:2011-09-18 12:18:55

标签: objective-c mapkit mkannotation mkannotationview

我创建了一个注释,我将其添加到MKMapView中。如何使用自定义图像而不是标准红色图钉?

@interface AddressAnnotation : NSObject<MKAnnotation> {
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
    MKPinAnnotationColor pinColor;
}
@property (nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *subtitle;
@property (nonatomic, assign) MKPinAnnotationColor pinColor;
@end

3 个答案:

答案 0 :(得分:18)

MKMapView从其委托方法mapView:viewForAnnotation:获取其引脚视图所以你必须:

  1. 将视图控制器设置为地图的委托。
  2. 在控制器中实现mapView:viewForAnnotation。
  3. 将您的控制器设置为代理

    @interface MapViewController : UIViewController <MKMapViewDelegate>
    

    使用委托协议标记接口。这让你在Interface Builder(IB)中将控制器设置为MKMapView的委托。打开包含地图的.xib文件,右键单击MKMapView,然后将delegate插座拖到控制器上。
    如果您更喜欢使用代码而不是IB,请在控制器的viewDidLoad方法中添加self.yourMapView.delegate=self;。结果将是相同的。

    实施mapView:viewForAnnotation:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        // this part is boilerplate code used to create or reuse a pin annotation
        static NSString *viewId = @"MKPinAnnotationView";
        MKPinAnnotationView *annotationView = (MKPinAnnotationView*) 
            [self.mapView dequeueReusableAnnotationViewWithIdentifier:viewId];
        if (annotationView == nil) {
            annotationView = [[[MKPinAnnotationView alloc] 
                initWithAnnotation:annotation reuseIdentifier:viewId] autorelease];
        }
        // set your custom image
        annotationView.image = [UIImage imageNamed:@"emoji-ghost.png"];
        return annotationView;
    }
    

答案 1 :(得分:1)

覆盖mapView:viewForAnnotation:委托方法。如果annotation参数指向您的某个自定义注释,请返回符合您自己喜好的自定义视图。

答案 2 :(得分:0)

要设置自定义图片而不是标准MKPinAnnotationView,唯一的方法是使用MKAnnotationView功能- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation。这是一个例子:

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

     if ([annotation isKindOfClass:[MKUserLocation class]]) {
                return  nil;
     }

     static NSString *identifier = @"Annotation";

     MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

     if (!aView) {
          aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
          aView.image = [UIImage imageNamed:@"Untitled1.png"];
          aView.canShowCallout = YES;
          aView.draggable = YES;
     } else {
          aView.annotation = annotation;
     }

     return pin;
}

对于aView.image值您可以设置自己的图像。并且还要查看MKAnnotationView类引用以便更好地处理它。