ios开发-MapKit(地图框架)使用简介

我们使用app的时候,很多软件都自带了地图功能。我们可以看到自己的位置,看到周围商场等信息。我们也可以导航,划线等。

其实苹果的MapKit使用起来还是很简单的。这里简单的介绍一下。

 

0.使用前准备

1.导入MapKit.framework框架

2.在工程的info.plist中增加两行字段(ios8必须做这两个步骤)

NSLocationAlwaysUsageDescription
NSLocationWhenInUseDescription
 
3.在storyboard普通控制器中,拖一个mapKitView,并设置好约束,并连线获得属性
//地图

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

 

 
 
1.向用户获取定位授权
在一个普通的控制器中,导入头文件,

#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;

这时候 ,我们真机运行就能定位到自己的位置了(模拟器可以自己设置经纬度),那个蓝色的大圆点就是我们的位置,俗称大头针

 ios开发-MapKit(地图框架)使用简介

 

 

 

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位置信息。我们可以转为具体的地理名称

实现上面的代理之后,我们点击蓝色大头针,就可以看到具体的信息啦。

 ios开发-MapKit(地图框架)使用简介

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];

    

}

 ios开发-MapKit(地图框架)使用简介

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;

}

 ios开发-MapKit(地图框架)使用简介

 

 

你可能感兴趣的:(MapKit)