我想将图像设置为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
答案 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>
addAnnotations
和MKAnnotation
方法仅要求注释模型对象(实现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}}