看官方的文档,以及看苹果官方的demo。An annotation object is any object that conforms to the MKAnnotation protocol。
当我们自定义注释对象需要实现MKAnnotation协议就可以了。但是进入MKAnnotation一看
只有一个属性。但是后面的title,subtitle,以及set方法。应该怎么理解呢?我真的没理解。希望明白的大神能够指出。看官方的demo
MapCalloutsUsingMapKitAnnotations。里面自定义了三种不同的注释对象。
其实当我们在MKMapView里面增加一个标注的时候。并且不实现任何协议。就增加一个
MKPointAnnotation *pa = [[MKPointAnnotation alloc]init];
pa.coordinate= newLocation.coordinate;
[_mapviewaddAnnotation:pa];
MKMapView默认是显示红色的大头针。如下如所示
这里还留有一个疑问我自己还没弄明白。当在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;
}
运行效果图如下
增加的二个标注红色的旗帜。
补充一点。CoreLocation获取的经纬度是地图坐标。而mapkit里面的坐标是火星坐标。所以需要转化哈。转化之后他们会重叠