自定义MKMapView大头针标注图片替换

看官方的文档,以及看苹果官方的demo。An annotation object is any object that conforms to the MKAnnotation protocol。

当我们自定义注释对象需要实现MKAnnotation协议就可以了。但是进入MKAnnotation一看

自定义MKMapView大头针标注图片替换_第1张图片

只有一个属性。但是后面的title,subtitle,以及set方法。应该怎么理解呢?我真的没理解。希望明白的大神能够指出。看官方的demo

MapCalloutsUsingMapKitAnnotations。里面自定义了三种不同的注释对象。

其实当我们在MKMapView里面增加一个标注的时候。并且不实现任何协议。就增加一个

MKPointAnnotation *pa = [[MKPointAnnotation   alloc]init];

pa.coordinate= newLocation.coordinate;

[_mapviewaddAnnotation:pa];

MKMapView默认是显示红色的大头针。如下如所示


自定义MKMapView大头针标注图片替换_第2张图片

这里还留有一个疑问我自己还没弄明白。当在map上面显示用户的当前位置。并且当前位置的经纬度给增加一个标注对象。他们为什么没有重合。或者他们的经纬度不是一套,就像百度的火星地图?希望明白的大神指出。

如果不详显示默认的红色的大头针。那么需要自定义。

下面是我看了官方文档自己定义的

#import

#import

@interfaceFishFxAnnotation :NSObject

@property(nonatomic,readwrite)CLLocationCoordinate2Dcoordinate;

+(MKAnnotationView*)createViewAnnotationForMapView:(MKMapView*)mapViewannotation:(id)annotation;

@end


实现

#import"FishFxAnnotation.h"

@implementationFishFxAnnotation

-(NSString*)title{

return@"天气";

}

-(NSString*)subtitle{

return@"subtitle";

}

+(MKAnnotationView*)createViewAnnotationForMapView:(MKMapView*)mapViewannotation:(id)annotation{

MKAnnotationView*returnedAnnotationView =

[mapViewdequeueReusableAnnotationViewWithIdentifier:NSStringFromClass([FishFxAnnotationclass])];

if(returnedAnnotationView ==nil)

{

returnedAnnotationView =

[[MKAnnotationViewalloc]initWithAnnotation:annotation

reuseIdentifier:NSStringFromClass([FishFxAnnotationclass])];

returnedAnnotationView.canShowCallout=YES;

// offset the flag annotation so that the flag pole rests on the map coordinate

returnedAnnotationView.centerOffset=CGPointMake( returnedAnnotationView.centerOffset.x+ returnedAnnotationView.image.size.width/2, returnedAnnotationView.centerOffset.y- returnedAnnotationView.image.size.height/2);

}

else

{

returnedAnnotationView.annotation= annotation;

returnedAnnotationView.centerOffset=CGPointMake( returnedAnnotationView.centerOffset.x+ returnedAnnotationView.image.size.width/2, returnedAnnotationView.centerOffset.y- returnedAnnotationView.image.size.height/2);

}

returnreturnedAnnotationView;

}

@end

在UIViewController里面的实现

- (void)viewDidLoad {

[superviewDidLoad];

_mapView=[[MKMapViewalloc]initWithFrame:CGRectMake(0,0,320,400)];

_mapView.delegate=self;

[self.viewaddSubview:_mapView];

FishFxAnnotation*annation=[[FishFxAnnotationalloc]init];

[annationsetCoordinate:CLLocationCoordinate2DMake(30.23423,104.345354)];

[_mapViewaddAnnotation:annation];

FishFxAnnotation*annation2=[[FishFxAnnotationalloc]init];

[annation2setCoordinate:CLLocationCoordinate2DMake(30.63423,104.645354)];

[_mapViewaddAnnotation:annation2];

[_mapViewshowAnnotations:@[annation,annation2]animated:YES];

}

- (nullableMKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id)annotation{

MKAnnotationView*returnAnnotationView=nil;

if([annotationisKindOfClass:[FishFxAnnotationclass]])

{

returnAnnotationView = [FishFxAnnotationcreateViewAnnotationForMapView:self.mapViewannotation:annotation];

returnAnnotationView.image= [UIImageimageNamed:@"flag.png"];

}

returnreturnAnnotationView;

}

运行效果图如下


自定义MKMapView大头针标注图片替换_第3张图片

增加的二个标注红色的旗帜。

补充一点。CoreLocation获取的经纬度是地图坐标。而mapkit里面的坐标是火星坐标。所以需要转化哈。转化之后他们会重叠

你可能感兴趣的:(自定义MKMapView大头针标注图片替换)