地图在如今的app中使用率十分高,我们可以去任何一个陌生的城市,都不会迷路。地图还能帮我们定位附近的美食、酒店、电影院等等。地图正在悄无声息的改变着我们的生活,改变我们的工作方式。学好地图在现在的开发越来越重要。
首先,在iOS开发中,苹果已经提供了SDK:MapKit。可以使用不同的API以达到地图信息自定义显示的目的。
(一)使用MapKit的准备
首先在xCode中导入苹果的框架。
导入头文件
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
并且遵循代理
@interface ViewController ()<MKMapViewDelegate>
@end
要想显示地图信息。在storyboard中添加控件Mapview,自动布局。连线在viewcontroller中
@property (weak, nonatomic) IBOutlet MKMapView *MapView;
MKmapview为我们提供了一个操作地图的接口,就如同地图应用直接提供给我们的一样。我们可以用它去显示一些地图信息,或者是用它去操作来自应用的地图内容,也可以将地图定位显示在某一个固定的坐标上,设定你要显示的地图区域大小,当然也可以在地图中添加注释及一些自定义的信息。
MapKit使用时注意:框架中所有数据前缀都是MK
(二)显示用户的当前位置信息
1.想获得地图信息,首先要获得用户的位置,此时就要定位。
使用系统提供的Anotation显示用户的当前位置信息:
在ViewController中添加一给私有属性,用来获取用户的当前位置
然后懒加载.如下:
@property (nonatomic, strong) CLLocationManager *manager; - (CLLocationManager *)manager { if (_manager == nil) { //1.创建一个定位管理器 _manager = [[CLLocationManager alloc]init]; } return _manager; }
2.CLLocationManager的常用操作
开始用户定位 - (void)startUpdatingLocation;
停止用户定位 - (void) stopUpdatingLocation;
当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
locations参数里面装着CLLocation对象
CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等
//经纬度 @property(readonly, nonatomic) CLLocationCoordinate2D coordinate; //海拔 @property(readonly, nonatomic) CLLocationDistance altitude; //路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向) @property(readonly, nonatomic) CLLocationDirection course; //行走速度(单位是m/s) @property(readonly, nonatomic) CLLocationSpeed speed; //计算2个位置之间的距离 - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
3.如何获取用户位置信息:
- (void)viewDidLoad { [super viewDidLoad]; //2.获取用户的授权 [self.manager requestAlwaysAuthorization]; //3.开始定位 [self.manager startUpdatingLocation]; //4.设置代理 self.manager.delegate = self; }
4.注意:模拟器中可能无法获取授权界面,换成真机调试便好
从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权
要想获得用户的位置 想访问用户的通讯录、日历、相机、相册等等 当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权。
5.实现代理方法:
#pragma mark - CLLocationManagerDelegate - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { //1.获取用户的位置 CLLocation *location = [locations firstObject]; CLLocationCoordinate2D coordinate = location.coordinate; NSLog(@"%f ---- %f",coordinate.latitude,coordinate.longitude); NSLog(@"locations"); }
(三)MapKit使用
1.设置用户的位置
/** * 更新到当前用户的位置就会调用 * * @param mapView mapView * @param userLocation 用户位置 */ - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { //MKUserLocation 系统默认的大头针模型 决定了蓝色大头针视图显示的内容 userLocation.title = @"北京"; userLocation.subtitle = @"博客园Marking_Ja"; }
区域发生改变的时候调用。当用户位置改变的时候调用:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { NSLog(@"regionDidChangeAnimated"); NSLog(@"%f %f ",self.mapView.region.span.latitudeDelta,self.mapView.region.span.longitudeDelta); }
区域已经发生改变的时候调用:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; { } NSLog(@"位置已经发生改变");
4.设置地图的显示:
5.MKCoordinateRegion的使用
typedef struct { CLLocationCoordinate2D center; // 区域的中心点位置 MKCoordinateSpan span; // 区域的跨度 } MKCoordinateRegion; MKCoordinateSpan的定义 typedef struct { CLLocationDegrees latitudeDelta; // 纬度跨度 CLLocationDegrees longitudeDelta; // 经度跨度 } MKCoordinateSpan;
(四)大头针
系统默认的大头针不足以满足开发的需要。大头针一般需要显示图片,文字用来描述一个地方。所有大部分都需要自定义大头针。
如何自定义大头针:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;