前面的地图与定位中介绍了基础定位和地理编码下面介绍一下大头针的内容
MKAnnotationView:大头针视图
MKAnnotation:大头针数据模型
(1)大头针在地图上的展示
《1》MKAnnotationView类似于Cell
《2》MKAnnotation类似表视图里面的model
《3》- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation类似与初始化cell的地方。
《4》如果只添加了Annotation会自动添加一个大头针视图pinAnnotationView
(2)大头针的介绍
《1》大头针数据模型:MKAnnotation是一个协议
《2》大头针视图:MKAnnotationView自己可以随意定义大头针的样式,
MKPinAnnotation是MKAnnotationView的子类不能改变大头针视图的图片,可以改变大头针的颜色
大头针视图用于显示内容的View
MKANnotationView 可以自定义
(1)初始化:initWithAnnotation: reuseIdentifier:
(2)属性:image设置大头针图片
《3》centerOffset
中心点的偏移量 x正右 y正下
《4》calloutOffset插图的偏移量
《5》enabled是否激活默认YES
《6》highlighted是否高亮默认NO
《7》selected是否选中
*****《8》canShowCallout设置是否可以显示插入视图
《9》leftCalloutAccessoryView左侧插入视图的附加视图
《10》rightCalloutAccessoryView:右侧插入视图的附加视图
《11》detailCalloutAccessoryView iOS9之后出现 插入视图的详细视图
《12》draggable是否可以拖拽
《13》dragState拖拽的状态
具体代码
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interfaceViewController ()<MKMapViewDelegate>
{
CLLocationManager *locationManager;
MKMapView *mymapView;
NSMutableArray *allAnnotations;//全部的大头针数据模型
}
@property(nonatomic,strong)CLGeocoder *geoceder;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// 初始化locationManager
locationManager = [[CLLocationManageralloc]init];
// 请求用户授权
[locationManagerrequestAlwaysAuthorization];
// 初始化mapView
mymapView = [[MKMapViewalloc]initWithFrame:[UIScreenmainScreen].bounds];
// 地图的样式
mymapView.mapType =MKMapTypeStandard;
// 显示用户位置
mymapView.showsUserLocation =YES;
// 挂上代理
mymapView.delegate =self;
[self.viewaddSubview:mymapView];
/*
需求:长按地图上的某一个点,添加一个大头针,大头针显示在地图上的真实位置
1、地图上添加一个长按手势
2、添加一个大头针数据模型到地图上
(1)视图上的point需要转换成经纬度
(2)数据模型添加到地图上
addAnnotation:添加一个大头针数据模型的方法
addAnnotations:添加一组大头针数据模型
removeAnnotation:移除一个大头针
removeAnnotations移除一组大头针
经纬度和point转换的方法
把经纬度转成point
convertCoordinate: toPointToView:
把point转换成经纬度
convertPoint:t toCoordinateFromView:
*/
UILongPressGestureRecognizer *addPoint = [[UILongPressGestureRecognizeralloc]initWithTarget:selfaction:@selector(addPoint:)];
[mymapViewaddGestureRecognizer:addPoint];
}
- (void)addPoint:(UILongPressGestureRecognizer *)sender{
if (sender.state !=UIGestureRecognizerStateBegan) {
return;
}
MKPointAnnotation *pointAnnotation = [[MKPointAnnotationalloc]init];
// 通过手势,得到手指触摸的电->point
CGPoint point = [senderlocationInView:self.view];
// 通过地图类把点转换成经纬度
CLLocationCoordinate2D coordinate = [mymapViewconvertPoint:pointtoCoordinateFromView:sender.view];
NSLog(@"%f %f",coordinate.latitude,coordinate.longitude);
[self.geocederreverseGeocodeLocation:[[CLLocationalloc]initWithLatitude:coordinate.latitudelongitude:coordinate.longitude] completionHandler:^(NSArray<CLPlacemark *> *_Nullable placemarks, NSError * _Nullable error) {
pointAnnotation.coordinate = coordinate;
pointAnnotation.title = placemarks.firstObject.name;
[mymapViewaddAnnotation:pointAnnotation];
//3、添加大头针的时候,同时把大头针的数据存到数组
[allAnnotationsaddObject:@{@"coordinate":@{@"latitude":@(coordinate.latitude),@"longitude":@(coordinate.longitude)},@"title":placemarks.firstObject.name}];
}];
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
// 设置用户位置为视图中心点
[mapView setCenterCoordinate:userLocation.location.coordinateanimated:YES];
// 设置地图显示的范围
MKCoordinateSpan span =MKCoordinateSpanMake(0.1,0.1);
MKCoordinateRegion region =MKCoordinateRegionMake(userLocation.location.coordinate, span);
[mapView setRegion:regionanimated:YES];
// userLocation:是一个MKUserLocation-》是一个大头针数据模型(用于表示用户位置)——》遵守MKAnnotation的协议->协议里有经纬度、标题、副标题
// MKUserLocation:经纬度、标题、副标题航向location
userLocation.title =@"四叶草";
userLocation.subtitle =@"幸运符号";
// MKAnnotationView
}
#pragma mark------关于大头针-------
- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
// 判断是不是用户的大头针模型
if ([annotationisKindOfClass:[MKUserLocationclass]]) {
// 初始化annotationView大头针视图
MKAnnotationView *annotationView = [[MKAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier:@"user"];
// 设置大头针视图的图片
annotationView.image = [UIImageimageNamed:@"四叶草6"];
// 是否允许插入视图
annotationView.canShowCallout =YES;
// 设置大头针视图中心点偏移
// x为正是向右
// Y为正的时候向下
// annotationView.centerOffset = CGPointMake(100, 0);
// 设置大头针插入视图的偏移量
// annotationView.calloutOffset = CGPointMake(100, 0);
// 设置大头针视图是否可以拖动
annotationView.draggable =YES;
// annotationView.dragState 拖动的状态
// 设置左侧配件视图
UIImageView *imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,0,30, 30)];
imageView.image = [UIImageimageNamed:@"zhangsan"];
// annotationView.rightCalloutAccessoryView = imageView;
// annotationView.detailCalloutAccessoryView = imageView;
return annotationView;
}
returnnil;
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// 作业1、判断有没有可以读取的大头针数据模型
if ([[NSUserDefaultsstandardUserDefaults]boolForKey:@"isSave"]) {
allAnnotations = [[[NSUserDefaultsstandardUserDefaults]arrayForKey:@"allAnnotations"]mutableCopy];
NSMutableArray *lit = [NSMutableArrayarray];
for (NSDictionary *infoinallAnnotations) {
MKPointAnnotation *an = [[MKPointAnnotationalloc]init];
an.coordinate =CLLocationCoordinate2DMake([info[@"coordinate"][@"latitude"]doubleValue], [info[@"coordinate"][@"longitude"]doubleValue]);
an.title = info[@"title"];
[lit addObject:an];
}
// 作业2、如果添加到地图上
[mymapViewaddAnnotations:lit];
}else{
allAnnotations = [NSMutableArrayarray];
}
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self save];
}
- (void)save{
NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
if (allAnnotations.count!=0) {
[defaults setObject:allAnnotationsforKey:@"allAnnotations"];
[defaults setBool:YESforKey:@"isSave"];
// 同步保存
[defaults synchronize];
}
}
- (CLGeocoder *)geoceder{
if (!_geoceder) {
_geoceder = [[CLGeocoderalloc]init];
}
return_geoceder;
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end