MKAnnotationView.image没有反映出来

时间:2014-05-10 19:54:14

标签: objective-c mapkit mkannotationview

我想将图像设置为MKAnnotationView 但图像没有反映出来。这是正常的红色针。

ViewController.m

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
#import "CustomAnnotation.h"
@interface ViewController ()<MKMapViewDelegate>
@end
@implementation ViewController{
    MKMapView* _mapView;
}

- (void)viewDidLoad{
    CustomAnnotation* annotation = [[CustomAnnotation alloc]init];
    annotation.coordinate = CLLocationCoordinate2DMake(35.6699877, 139.7000456);
    annotation.image = [UIImage imageNamed:@"annotation.png"];
    [_mapView addAnnotations:@[annotation]];
}

CustomAnnotation.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface CustomAnnotation : MKAnnotationView
@property (readwrite, nonatomic) CLLocationCoordinate2D coordinate;
@property (readwrite, nonatomic, strong) NSString* title;
@end

CustomAnnotation.m

#import "CustomAnnotation.h"
@implementation CustomAnnotation
@end

1 个答案:

答案 0 :(得分:1)

要使用自定义图片,您必须在地图视图的MKAnnotationView 委托方法中创建并返回viewForAnnotation

如果您没有实现该委托方法,地图视图将显示您添加的注释的默认红色图钉(无论注释是什么类别)。

以下是您如何实施它的示例:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if (! [annotation isKindOfClass:[CustomAnnotation class]])
    {
        //if this annotation is not a CustomAnnotation
        //(eg. user location blue dot),
        //return nil so the map view draws its default view for it...
        return nil;
    }

    static NSString *reuseId = @"ann";
    MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (av == nil)
    {
        av = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];
        av.canShowCallout = YES;
        av.image = [UIImage imageNamed:@"annotation.png"];
    }
    else
    {
        av.annotation = annotation;
    }

    return av;
}

请务必在代码中设置地图视图的delegate属性,或者连接storyboard / xib中的插座。如果未设置delegate,即使您已实施viewForAnnotation方法,地图视图也不会调用addAnnotation方法,并且您仍会获得默认的红色图钉。< / p>


addAnnotationsMKAnnotation方法仅要求注释模型对象(实现coordinate协议的对象,主要由viewForAnnotation属性组成)。

这些注释模型对象的视图必须在CustomAnnotation委托方法中返回。

即使您的MKAnnotation类没有明确声明它符合coordinate,它也会实现MKAnnotationView属性,因此地图视图可以在地图。

事实上它恰好也是MKAnnotationView的子类,这是地图视图不关心或使用注释模型对象的事情。

您的注释模型对象不应该是MKAnnotation的子类,因为它只会导致混淆。它应该只实现NSObject<MKAnnotation>协议,因此它应该是NSObject的子类(或CustomAnnotation之外的其他一些自定义类)。

@interface CustomAnnotation : NSObject<MKAnnotation> 界面更改为:

title

strong属性从copy更改为MKAnnotation以匹配@property (readwrite, nonatomic, copy) NSString* title; 协议:

CustomAnnotation

由于MKAnnotationView不再是image =,请从viewDidLoad移除title行,并确保设置注释//annotation.image = [UIImage imageNamed:@"annotation.png"]; annotation.title = @"annotation"; 否则当您点击它时,标注不会显示:

{{1}}