iOS地图的显示(大头针)

Posted 雷坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS地图的显示(大头针)相关的知识,希望对你有一定的参考价值。

 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 }

 

以上是关于iOS地图的显示(大头针)的主要内容,如果未能解决你的问题,请参考以下文章

IOS_地图与定位

MapKit之大头针全面解析(使用系统大头针自定义大头针callout视图使用图片显示大头针)

iOS核心笔记—MapKit框架-基础

地图篇-04.添加/删除大头针

地图注释的自定义标题

iOS开发中地图开发的简单应用