参考:http://www.jianshu.com/p/9f00911bf530
前言:以前做项目用高德地图SDK,需要注册账号和AppID,然后下载SDK集成到项目中,比较麻烦,看了下苹果自带的MapKit框架,感觉挺好用,官方文档也介绍得很详细,实现地图的显示、显示用户当前位置、放置大头针、弹出气泡等基本功能。希望能帮到刚接触MapKit的朋友~干货点这里
导入主头文件:
#import
MapKit框架使用须知:
MapKit框架中所有数据类型的前缀都是MK。
MapKit有一个比较重要的UI控件 :MKMapView,专门用于地图显示。
跟踪显示用户的位置
设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置
MKUserTrackingModeNone:不跟踪用户的位置
MKUserTrackingModeFollow:跟踪并在地图上显示用户的当前位置
MKUserTrackingModeFollowWithHeading:跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转
蓝色发光圆点就是用户的当前位置 蓝色发光原点,专业术语叫做“大头针”
地图的类型
可以通过设置MKMapView的mapType设置地图类型 MKMapTypeStandard:普通地图
MKMapTypeSatellite:卫星云图
MKMapTypeHybrid:混合模式(普通地图覆盖于卫星云图之上)
MKMapTypeSatelliteFlyover:3D立体卫星(iOS9.0)
MKMapTypeHybridFlyover:3D立体混合(iOS9.0)
设置地图的其他属性
1.操作项:
<1.>是否可缩放 :zoomEnabled
<2.>是否可滚动 :scrollEnabled
<3.>是否可旋转 :rotateEnabled
2.显示项:
<1.>是否显示指南针 :showsCompass (iOS9.0)
<2.>是否显示比例尺 :showsScale (iOS9.0)
<3.>是否显示交通 :showsTraffic (iOS9.0)
<4.>是否显示建筑 :showsBuildings
使用注意:设置对应的属性时,注意该属性是从哪个系统版本开始引入的,做好不同系统版本的适配
追踪用户的位置
设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置
MKUserTrackingModeNone:不跟踪用户的位置
MKUserTrackingModeFollow:跟踪并在地图上显示用户的当前位置
MKUserTrackingModeFollowWithHeading:跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转
注意:iOS8.0之后,追踪用户位置需要用户进行定位授权
备注:
iOS8.0-,地图不会自动滚动到用户所在位置
iOS8.0+,地图会自动放大到合适比例,并显示出用户位置
MKMapView的代理
MKMapView可以设置一个代理对象,用来监听地图的相关行为
常见的代理方法有
1.调用非常频繁,不断监测用户的当前位置每次调用,都会把用户的最新位置(userLocation参数)传进来 - (void)mapView:(MKMapView*)mapViewdidUpdateUserLocation:(MKUserLocation*)userLocation;
2.地图的显示区域即将发生改变的时候调用 - (void)mapView:(MKMapView*)mapViewregionWillChangeAnimated:(BOOL)animated;
3.地图的显示区域已经发生改变的时候调用 - (void)mapView:(MKMapView*)mapViewregionDidChangeAnimated:(BOOL)animated;
MKUserLocation(MKUserLocation其实是个大头针模型,包括以下属性)
@property(nonatomic,copy)NSString*title;显示在大头针上的标题
@property(nonatomic,copy)NSString*subtitle;显示在大头针上的子标题
@property(readonly,nonatomic)CLLocation*location;地理位置信息(大头针钉在什么地方?)
设置地图的显示
通过MKMapView的下列方法,可以设置地图显示的位置和区域
1.设置地图的中心点位置 @property(nonatomic)CLLocationCoordinate2DcenterCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
2.设置地图的显示区域 @property(nonatomic)MKCoordinateRegionregion; - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
大头针的基本操作
添加一个大头针:- (void)addAnnotation:(id)annotation;
添加多个大头针:- (void)addAnnotations:(NSArray*)annotations;
移除一个大头针:- (void)removeAnnotation:(id)annotation;
移除多个大头针:- (void)removeAnnotations:(NSArray*)annotations;
(id)annotation参数是什么东西? 大头针模型对象:用来封装大头针的数据,比如大头针的位置、标题、子标题等数据
大头针模型
新建一个大头针模型类
#import
@interfaceMJTuangouAnnotation :NSObject
/**坐标位置*/ @property(nonatomic,assign)CLLocationCoordinate2Dcoordinate;
/**标题*/ @property(nonatomic,copy)NSString*title;
/**子标题*/ @property(nonatomic,copy)NSString*subtitle;
@end
添加大头针
EdTuangouAnnotation*anno = [[MJTuangouAnnotationalloc]init];
[email protected]"热爱iOS的狗";
[email protected]"全部课程15折,会员20折,老学员30折";
anno.coordinate=CLLocationCoordinate2DMake(40,116);
[self.mapViewaddAnnotation:anno];
MKAnnotationView:地图上的大头针控件是MKAnnotationView
MKAnnotationView的属性
@property(nonatomic,strong)id annotation :大头针模型
@property(nonatomic,strong)UIImage*image:显示的图片
@property(nonatomic)BOOLcanShowCallout:是否显示标注
@property(nonatomic)CGPointcalloutOffset:标注的偏移量
@property(strong,nonatomic)UIView*rightCalloutAccessoryView:标注右边显示什么控件
@property(strong,nonatomic)UIView*leftCalloutAccessoryView:标注左边显示什么控件
MKPinAnnotationView
MKPinAnnotationView是MKAnnotationView的子类
MKPinAnnotationView比MKAnnotationView多了2个属性
@property(nonatomic)MKPinAnnotationColorpinColor:大头针颜色
@property(nonatomic)BOOLanimatesDrop:大头针第一次显示时是否从天而降
MKMapItem调用系统APP进行导航
主要方法:[MKMapItem openMapsWithItems:items launchOptions:md];
示例代码
1.根据两个地标对象进行调用系统导航 - (void)beginNavWithBeginPlacemark:(CLPlacemark*)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
{
2.创建起点:根据CLPlacemark地标对象创建MKPlacemark地标对象 MKPlacemark *itemP1 = [[MKPlacemark alloc]
initWithPlacemark:beginPlacemark];
MKMapItem *item1 = [[MKMapItem alloc]initWithPlacemark:itemP1];
3.创建终点:根据CLPlacemark地标对象创建MKPlacemark地标对象 MKPlacemark *itemP2 = [[MKPlacemark alloc]initWithPlacemark:endPlacemark];
MKMapItem *item2 = [[MKMapItem alloc]initWithPlacemark:itemP2];
NSDictionary *launchDic = @{
4.设置导航模式参数 MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
5.设置地图类型 MKLaunchOptionsMapTypeKey :@(MKMapTypeHybridFlyover),
6.设置是否显示交通
MKLaunchOptionsShowsTrafficKey : @(YES),
};
7.根据MKMapItem数组和启动参数字典来调用系统地图进行导航
[MKMapItem openMapsWithItems:@[item1, item2]
launchOptions:launchDic];
}
MKMapCamera地图街景
主要方法:self.mapView.camera = camera;
示例代码
1.创建视角中心坐标:CLLocationCoordinate2D
center = CLLocationCoordinate2DMake(23.132931, 113.375924);
2.创建3D视角:
MKMapCamera *camera = [MKMapCameracameraLookingAtCenterCoordinate:center
fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude + 0.001,
center.longitude + 0.001) eyeAltitude:1];
3.设置到地图上显示:self.mapView.camera = camera;
MKMapSnapshotter地图截图
1.主要方法
[snapshotter startWithCompletionHandler:^(MKMapSnapshot
* _Nullable snapshot, NSError * _Nullable error) { }];
示例代码
截图附加选项:MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
1.设置截图区域(在地图上的区域,作用在地图):
options.region =self.mapView.region;
options.mapRect =self.mapView.visibleMapRect;
2.设置截图后的图片大小(作用在输出图像)
options.size =self.mapView.frame.size;
3.设置截图后的图片比例(默认是屏幕比例,作用在输出图像)
options.scale = [[UIScreen mainScreen] scale];
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc]
initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *_Nullablesnapshot,
NSError*_Nullableerror) {
if(error) {
NSLog(@"截图错误:%@",error.localizedDescription);
}else
{
4.设置屏幕上图片显示
self.snapshootImageView.image = snapshot.image;
将图片保存到指定路径(此处是桌面路径,需要根据个人电脑不同进行修改)
NSData *data = UIImagePNGRepresentation(snapshot.image);
[data writeToFile:@"/Users/wangshunzi/Desktop/snap.png"atomically:YES];
}
}];
MKDirections获取导航路线信息
主要方法
[directions calculateDirectionsWithCompletionHandler:
^(MKDirectionsResponse * _Nullable response,
NSError * _Nullable error) {
}];
绘制路线,添加覆盖层等
主要方法:(这里不像添加大头针那样,只要我们添加了大头针模型,默认就会在地图上添加系统的大头针视图)
1.添加覆盖层,需要我们实现对应的代理方法,在代理方法中返回对应的覆盖层[self.mapViewaddOverlay:overlay];
2.调用了以上方法后,会调用以下代理方法获取对应的渲染涂层 -(MKOverlayRenderer *)mapView:(MKMapView*)mapView rendererForOverlay:(id)overlay
文/百度工程师阿伟(简书作者)
原文链接:http://www.jianshu.com/p/9f00911bf530
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。