MapKit的基本使用
2016-07-02 本文已影响1677人
IIronMan
题外话:先学习CoreLocation的原因是:MapKit有一部分知识是基于CoreLocation,所以前面必须先了解CoreLocation
注意事项:
- 导入头文件<MapKit/MapKit.h>
- Mapkit框架里面的所有的数据类型的前缀都是以MK开头的
- MapKit有一个比较重要的UI控件:MKMapView ,专门用于地图显示
地图显示的概括:(导入框架<MapKit/MapKit.h>)
-
1.把地图放在view上
-
2.设置地图显示类型
/* MKMapTypeStandard 标准类型 MKMapTypeSatellite, 卫星图 MKMapTypeHybrid, 混合的图(标准+卫星) MKMapTypeSatelliteFlyover MKMapTypeHybridFlyover */
![](https://img.haomeiwen.com/i1728484/d3f4d813da4583b4.png)
-
3.请求获取用户获取地理位置权限(需要在info.plist里面进行配置)
[self.locationManger requestAlwaysAuthorization]; 配置代码:NSLocationAlwaysUsageDescription
-
4.追踪用户的位置(这样才可以显示大头针,也就是地图上蓝色的小点点)
/* MKUserTrackingModeNone = 0, 不追踪,不准确 MKUserTrackingModeFollow, 追踪 MKUserTrackingModeFollowWithHeading, 追踪并且获取用户方向 */
-
5.给MKMapView的对象挂代理,当在4中追踪到用户的位置之后就会调用下面的方法
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { }
![](https://img.haomeiwen.com/i1728484/809894e72af10cf8.png)
- 6.点击大头针显示用户的位置信息(这步操作是在第5步里面的方法中完成的)
提示:只要用户的地理位置发生改变下面的方法才会被调用,位置不发生改变就不会被调用
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
6.1 利用反地理编码,利用用户的经纬度来获取用户的位置名字,首先要在外面建立一个CLGeocoder *geocoder对象
6.2 调用一个方法(如下图):userLocation是大头针模型
第一个参数直接是用户的位置:userLocation.location
[self.geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark *placekmark = [placemarks firstObject];
userLocation.title = placekmark.name;
userLocation.subtitle = placekmark.locality;
}];
6.3 效果如下图
}
![](https://img.haomeiwen.com/i1728484/2de8a6326e2af3b1.png)
![](https://img.haomeiwen.com/i1728484/ab762774d33dada0.png)
![](https://img.haomeiwen.com/i1728484/47a8a5b5ca392635.png)
具体的代码如下:
提示:(运行下面的代码之前记得在info.plist里面进行权限配置)
#import "ViewController.h"
#import <MapKit/MapKit.h>
@interface ViewController ()<MKMapViewDelegate>
@property(nonatomic,strong) MKMapView *mapView;
@property(nonatomic,strong) CLLocationManager *locationManger;
@property(nonatomic,strong) CLGeocoder *geocoder;
@end
@implementation ViewController
//1.显示地图
-(MKMapView *)mapView
{
if (!_mapView) {
_mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:_mapView];
}
return _mapView;
}
- (void)viewDidLoad {
[super viewDidLoad];
//2.设置地图显示类型
self.mapView.mapType = MKMapTypeStandard;
/*
MKMapTypeStandard 标准类型
MKMapTypeSatellite, 卫星图
MKMapTypeHybrid, 混合的图(标准+卫星)
MKMapTypeSatelliteFlyover
MKMapTypeHybridFlyover
*/
//3用户定位权限跟踪设置
[self.locationManger requestAlwaysAuthorization];
//4.如果想利用MapView获取用户的位置,可以追踪用户的诶之
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
/*
MKUserTrackingModeNone = 0, 不追踪,不准确
MKUserTrackingModeFollow, 追踪
MKUserTrackingModeFollowWithHeading, 追踪并且获取用户方向
*/
//注意在IOS8里面想要追踪用户的位置,必须自己请求隐私权限
//5.关于地图的一些其他设置
//mapView.rotateEnabled = YES;
/*
scrollEnabled 支持拖动
rotateEnabled 支持旋转
pitchEnabled 支持缩放
*/
//mapView.showsUserLocation = YES;
//6.锁定位置直接移动到指定位置
self.mapView.delegate = self;
}
#pragma mark MKMapViewDelegate
/*
* 每次更新到用户的位置就会调用(调用不 频繁,只有位置改变才会调用)
*
* @param mapView 促发事件的控件
*
* @param userLocation 大头针模型
*
*/
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
/*
地图上蓝色的点就称之为大头针
大头针可以拥有标题/子标题/位置信息
MKUserLocation 大头针是由大头针的模型来确定
*/
//6.1设置大头针显示的内容
// userLocation.title = @"蓝科";
// userLocation.subtitle = @"牛逼";
//6.2移动地图到用户所在的位置
//获取用户当前所在位置的经纬度,并且设置为地图的中心点
//[self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
//6.3设置地图显示的区域
//获取用户的位置
//
// CLLocationCoordinate2D center = userLocation.location.coordinate;
//
// //将用户当前的位置作为显示区域的中心点,并且指定需要显示的跨度范围
// //
// MKCoordinateSpan span = MKCoordinateSpanMake(100, 100);
// MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
//
// //设置显示区域
// [self.mapView setRegion:region animated:YES];
//
//利用饭地理编码获取位置之后设置标题
[self.geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark *placekmark = [placemarks firstObject];
userLocation.title = placekmark.name;
userLocation.subtitle = placekmark.locality;
NSLog(@"==%@ ==%@",userLocation.title, userLocation.subtitle);
}];
}
-(CLGeocoder *)geocoder
{
if (!_geocoder) {
_geocoder = [[CLGeocoder alloc]init];
}
return _geocoder;
}
-(CLLocationManager *)locationManger
{
if (!_locationManger) {
_locationManger = [[CLLocationManager alloc]init];
}
return _locationManger;
}
@end
![](https://img.haomeiwen.com/i1728484/9474f802cc7cfc10.png)