1 1.导入主头文件 2 #import <MapKit/MapKit.h> 3 MapKit框架使用须知 4 MapKit框架中所有数据类型的前缀都是MK 5 MapKit有一个比较重要的UI控件:MKMapView,专门用于地图显示 6 7 2.跟踪显示用户的位置 8 9 设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置 10 MKUserTrackingModeNone :不跟踪用户的位置 11 MKUserTrackingModeFollow :跟踪并在地图上显示用户的当前位置 12 MKUserTrackingModeFollowWithHeading :跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转 13 3.地图的类型 14 15 可以通过设置MKMapView的mapType设置地图类型(mapViewType是枚举类型) 16 MKMapTypeStandard // 普通地图(左图) 17 MKMapTypeSatellite // 卫星云图 (中图) 18 MKMapTypeHybrid // 普通地图覆盖于卫星云图之上(右图) 19 MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0) // 地形和建筑物的三维模型 20 MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0) // 显示道路和附加元素的Flyover
1 MKMapView可以设置一个代理对象,用来监听地图的相关行为,常见的代理方法有: 2 3 // 一个位置更改默认只会调用一次,不断监测用户的当前位置时每次都会调用这个方法,把用户的最新位置(userLocation参数)传进来. 4 5 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation; 6 7 // 地图的显示区域即将发生改变的时候调用 8 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; 9 10 // 地图的显示区域已经发生改变的时候调用 11 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 12 13 MKUserLocation其实是个大头针模型,包括以下属性 14 // 显示在大头针上的标题 15 @property (nonatomic, copy) NSString *title; 16 17 // 显示在大头针上的子标题 18 @property (nonatomic, copy) NSString *subtitle; 19 20 // 地理位置信息(大头针钉在什么地方) 21 @property (readonly, nonatomic) CLLocation *location; 22 23 通过MKMapView的下列方法,可以设置地图显示的位置和区域 24 // 设置地图的中心点位置 25 @property (nonatomic) CLLocationCoordinate2D centerCoordinate; 26 27 -(void)setCenterCoordinate: (CLLocationCoordinate2D)coordinate animated:(BOOL)animated; 28 29 @property (nonatomic) MKCoordinateRegion region; 30 - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
大头针模型
1 新建一个大头针模型类 2 #import <MapKit/MapKit.h> 3 @interface MyAnnonation : NSObject <MKAnnotation> 4 /** 坐标位置 */ 5 @property (nonatomic, assign) CLLocationCoordinate2D coordinate; 6 /** 标题 */ 7 @property (nonatomic, copy) NSString *title; 8 /** 子标题 */ 9 @property (nonatomic, copy) NSString *subtitle; 10 @end
1 #pragma mark - 添加大头针 2 - (void)addAnnotation 3 { 4 // 设置位置 5 CLLocationCoordinate2D location1 = CLLocationCoordinate2DMake(40, 116); 6 MyAnnotation *annotation = [[MyAnnotation alloc] init]; 7 8 annotation.coordinate = location1; 9 annotation.title = @"BeiJing"; 10 annotation.subtitle = @"Myhome"; 11 #warning 添加代码 12 annotation.image = [UIImage imageNamed:@"88"]; 13 [_mapView addAnnotation:annotation]; 14 MyAnnotation *annotation2 = [[MyAnnotation alloc] init]; 15 CLLocationCoordinate2D location2 = CLLocationCoordinate2DMake(39, 121); 16 annotation2.coordinate = location2; 17 annotation2.title = @"DaLian"; 18 annotation2.subtitle = @"Hishome"; 19 [_mapView addAnnotation:annotation2]; 20 MyAnnotation *annotation3 = [[MyAnnotation alloc] init]; 21 22 CLLocationCoordinate2D location3 = CLLocationCoordinate2DMake(34, 113); 23 annotation3.coordinate = location3; 24 annotation3.title = @"zhengzhou"; 25 annotation3.subtitle = @"herhome"; 26 [_mapView addAnnotation:annotation3]; 27 }
1 // 添加一个大头针 2 - (void)addAnnotation:(id <MKAnnotation>)annotation; 3 4 5 // 添加多个大头针 6 - (void)addAnnotations:(NSArray *)annotations; 7 8 // 移除一个大头针 9 - (void)removeAnnotation:(id <MKAnnotation>)annotation; 10 11 // 移除多个大头针 12 - (void)removeAnnotations:(NSArray *)annotations;
自定义大头针
1 设置MKMapView的代理 2 实现下面的代理方法,返回大头针控件 3 4 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation; 5 根据传进来的(id <MKAnnotation>)annotation参数创建并返回对应的大头针控件 6 代理方法的使用注意 7 如果返回nil,显示出来的大头针就采取系统的默认样式 8 9 标识用户位置的蓝色发光圆点,它也是一个大头针,当显示这个大头针时,也会调用代理方法 10 11 因此,需要在代理方法中分清楚(id <MKAnnotation>)annotation参数代表自定义的大头针还是蓝色发光圆点 12 地图上的大头针控件是MKAnnotationView 13 14 MKAnnotationView的属性 15 16 // 大头针模型 17 @property (nonatomic, strong) id <MKAnnotation> annotation; 18 19 // 显示的图片 20 @property (nonatomic, strong) UIImage *image; 21 22 // 是否显示标注 23 @property (nonatomic) BOOL canShowCallout; 24 25 // 标注的偏移量 26 @property (nonatomic) CGPoint calloutOffset; 27 // 标注右边显示什么控件 28 @property (strong, nonatomic) UIView *rightCalloutAccessoryView; 29 30 // 标注左边显示什么控件 31 @property (strong, nonatomic) UIView *leftCalloutAccessoryView; 32 33 MKPinAnnotationView是MKAnnotationView的子类 34 35 MKPinAnnotationView比MKAnnotationView多了2个属性 36 37 // 大头针颜色 38 @property (nonatomic) MKPinAnnotationColor pinColor; 39 40 // 大头针第一次显示时是否从天而降 41 @property (nonatomic) BOOL animatesDrop; 42 43 CLLocationManager 定位的基础信息 44 CLLocation 位置的地理信息 45 CLLocationCoordinate2D 存放经纬度的结构体 46 CLGeocoder地理位置编码与反编码的类 47 CLPlacemark 地标. 48 MKMapView 基础地图 49 MKUserLocation 大头针模型 50 MKCoordinateRegion 显示区域的结构体 51 MKAnnotationView 自定义大头针控件
1 #import "ViewController.h" 2 3 // 地图使用的框架是MapKit 4 // 引入框架 5 #import <MapKit/MapKit.h> 6 #import <CoreLocation/CoreLocation.h> 7 #import "MyAnnotation.h" 8 @interface ViewController ()<MKMapViewDelegate> 9 10 // 定位管理器 11 @property (nonatomic, strong) CLLocationManager *locationManager; 12 13 // 显示地图的视图 14 @property (nonatomic, strong) MKMapView *mapView; 15 @end 16 17 @implementation ViewController 18 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 // Do any additional setup after loading the view, typically from a nib. 22 /* 23 大头针: 24 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的“大头针”。只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针,通常会重写协议中coordinate(标记位置)、title(标题)、subtitle(子标题)三个属性,然后在程序中创建大头针对象并调用addAnnotation:方法添加大头针即可(之所以iOS没有定义一个基类实现这个协议供开发者使用,多数原因应该是MKAnnotation是一个模型对象,对于多数应用模型会稍有不同,例如后面的内容中会给大头针模型对象添加其他属性)。 25 */ 26 // 创建视图 27 [self createMapView]; 28 29 } 30 31 #pragma mark - 创建视图 32 - (void)createMapView 33 { 34 // 创建地图,并添加到当前视图上 35 self.mapView = [[MKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 36 [self.view addSubview:self.mapView]; 37 // 设置代理 38 _mapView.delegate = self; 39 40 // 定位的设置 41 self.locationManager = [[CLLocationManager alloc] init]; 42 // 判断是否可用 43 if (![CLLocationManager locationServicesEnabled]) { 44 NSLog(@"当前设备定位不可用"); 45 } 46 // 47 if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) { 48 [self.locationManager requestWhenInUseAuthorization]; 49 } 50 51 // 设置地图的定位追踪 52 _mapView.userTrackingMode = MKUserTrackingModeFollow; 53 54 // 设置地图的类型 55 _mapView.mapType = MKMapTypeStandard; 56 57 // 添加大头针 58 [self addAnnotation]; 59 60 } 61 62 #pragma mark - 添加大头针 63 - (void)addAnnotation 64 { 65 // 设置位置 66 CLLocationCoordinate2D location1 = CLLocationCoordinate2DMake(40, 116); 67 MyAnnotation *annotation = [[MyAnnotation alloc] init]; 68 69 annotation.coordinate = location1; 70 annotation.title = @"BeiJing"; 71 annotation.subtitle = @"Myhome"; 72 #warning 添加代码 73 annotation.image = [UIImage imageNamed:@"88"]; 74 [_mapView addAnnotation:annotation]; 75 MyAnnotation *annotation2 = [[MyAnnotation alloc] init]; 76 CLLocationCoordinate2D location2 = CLLocationCoordinate2DMake(39, 121); 77 annotation2.coordinate = location2; 78 annotation2.title = @"DaLian"; 79 annotation2.subtitle = @"Hishome"; 80 [_mapView addAnnotation:annotation2]; 81 MyAnnotation *annotation3 = [[MyAnnotation alloc] init]; 82 83 CLLocationCoordinate2D location3 = CLLocationCoordinate2DMake(34, 113); 84 annotation3.coordinate = location3; 85 annotation3.title = @"zhengzhou"; 86 annotation3.subtitle = @"herhome"; 87 [_mapView addAnnotation:annotation3]; 88 } 89 90 #pragma mark - 代理方法 91 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 92 { 93 NSLog(@"=====%@", userLocation); 94 } 95 96 #pragma mark - 实现自定义大头针视图的代理方法 97 // 显示大头针的时候才会调用 98 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 99 { 100 // 判断是否是当前自定义的大头针类 101 if ([annotation isKindOfClass:[MyAnnotation class]]) { 102 103 // 先定义一个重用标识 104 static NSString *identifier = @"Annotation"; 105 MKAnnotationView *annotationView =[_mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 106 // 重用机制 107 if (!annotationView) { 108 annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 109 // 允许用户交互 110 annotationView.canShowCallout = YES; 111 // 设置详情和大头针的头偏移量 112 annotationView.calloutOffset = CGPointMake(0, 1); 113 // 设置详情的左视图 114 annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"88"]]; 115 116 } 117 // 修改大头针视图 118 119 annotationView.annotation = annotation; 120 // 强转 121 annotationView.image = ((MyAnnotation *)annotation).image; 122 123 return annotationView; 124 125 126 } else { 127 return nil; 128 } 129 }