我们使用app的时候,很多软件都自带了地图功能。我们可以看到自己的位置,看到周围商场等信息。我们也可以导航,划线等。
其实苹果的MapKit使用起来还是很简单的。这里简单的介绍一下。
0.使用前准备
1.导入MapKit.framework框架
2.在工程的info.plist中增加两行字段(ios8必须做这两个步骤)
![](https://i-blog.csdnimg.cn/blog_migrate/9bf13b723d56765fd43cb6d322b52a7a.png)
//地图 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
CoreLocation是核心定位
设置一个CLLocationManager属性,用于请求授权
//位置管理器 @property (nonatomic, strong) CLLocationManager *manager; //懒加载位置管理器 - (CLLocationManager *)manager { if (_manager == nil) { _manager = [[CLLocationManager alloc] init]; } return _manager; }
然后请求访问位置,并设置地图跟踪模式
//请求允许访问位置 [self.manager requestAlwaysAuthorization]; //当前地图跟踪模式 self.mapView.userTrackingMode = MKUserTrackingModeFollow;
这时候 ,我们真机运行就能定位到自己的位置了(模拟器可以自己设置经纬度),那个蓝色的大圆点就是我们的位置,俗称大头针
2.添加大头针描述
我们点击大头针的时候,希望看到当前的位置信息。这里我们可以来设置一下。
先设置mapView的代理为self,并遵守代理
//设置地图代理 self.mapView.delegate = self;
在实现下面的代理方法,此方法每次位置变动,都会调用
//更新位置的时候,会触发 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { NSLog(@"11"); //当前的坐标,反编码 CLGeocoder *geo = [[CLGeocoder alloc] init]; [geo reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) { //取出标记 CLPlacemark *pm = [placemarks lastObject]; //赋值 userLocation.title = pm.name; }]; }
上面的CLGeocoder是一个地理编码解析器。可以将位置信息转为给定名称。也可以将给定的名称(例如北京)装换为位置信息(经纬度等等)。
userLocation中,只有location位置信息。我们可以转为具体的地理名称
实现上面的代理之后,我们点击蓝色大头针,就可以看到具体的信息啦。
3.添加大头针
我们点击地图其它的地方,希望可以钉一个大头针,手指点哪里,哪里就钉一个
这个做法其实也很简单,我们需要自定义一个大头针类,遵守MKAnnotation协议,并实现协议内容
#import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface HJCAnnotion : NSObject <MKAnnotation> //位置(必选) @property (nonatomic, assign) CLLocationCoordinate2D coordinate; //标题(可选) @property (nonatomic, copy) NSString *title; //子标题(可选) @property (nonatomic, copy) NSString *subtitle; @end
先给mapView添加手势
//创建手势 UITapGestureRecognizer *top = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(addMyAnootation:)]; //加入地图上 [self.mapView addGestureRecognizer:top];
在实现手势方法
//点击地图时候,添加大头针的方法 - (void)addMyAnootation:(UITapGestureRecognizer *)top { //获得手点击的坐标 CGPoint touchPoint = [top locationInView:top.view]; //装换为地图的坐标 CLLocationCoordinate2D cd = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView]; //创建自定义的大头针 HJCAnnotion *annotation = [[HJCAnnotion alloc] init]; //设置大头针的坐标 annotation.coordinate = cd; //设置大头针的标题 annotation.title = @"呵呵"; //添加到地图中 [self.mapView addAnnotation:annotation]; }
4.自定义大头针View
我们加入不想用系统默认的红头的大头针,我们就可以自定义大头针的view了。通过代理实现。这里需要考虑view重用的问题
返回nil就表示用系统默认的
//自定义大头针view - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { //假如是定位的蓝色大头针,直接返回nil if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } //可重用ID static NSString *viewID = @"myAnnotation"; //从缓存池中取 MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:viewID]; //加入没有重新创建 if(annoView == nil){ annoView = [[MKAnnotationView alloc] init]; } //赋值 annoView.image = [UIImage imageNamed:@"category_1"]; //返回 return annoView; }