Corelocation基本使用
在地图章节的学习中,首先要学的便是用户位置定位,因此我们首先要掌握Corelocation的使用。(在IOS8以前可以系统会直接请求授权,现在需要我们自己调用方式通知系统请求授权)
首先设置一个Corelocation属性并实现懒加载设置代理,此对象需要自己调用方法startUpdatingLocation及stopUpdatingLocation来开始和结束位置获取
1 //定位管理者 2 @property (nonatomic , strong ) CLLocationManager *manager; 3 - (CLLocationManager *)manager{ 4 if (_manager == nil) { 5 //创建CoreLocation管理者 6 _manager = [[CLLocationManager alloc] init];
7 _manager.delegate = self; 8 } 9 return _manager; 10 }
设置好定位管理者对象后就对其属性进行一些常用的属性配置
1 //配置定位精度 2 /* 3 导航级别: kCLLocationAccuracyBestForNavigation; 4 最优: kCLLocationAccuracyBest; 5 精确到10米: kCLLocationAccuracyNearestTenMeters; 6 精确到100米: kCLLocationAccuracyHundredMeters; 7 精确到1000米: kCLLocationAccuracyKilometer; 8 精确到3000米: kCLLocationAccuracyThreeKilometers; 9 */ 10 self.manager.desiredAccuracy = kCLLocationAccuracyBest; 11 //设置超过范围后更新数据,如不设置数据会一直不间断更新 12 self.manager.distanceFilter = 100;
若使用[self.manager requestAlwaysAuthorization]方法需要添加NSLocationAlwaysUsageDescription为key
1 //判断系统IOS版本 2 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { 3 NSLog(@"IOS8"); 4 //注意:IOS8后需要验证授权,在Info.plist文件还要加上NSLocationWhenInUseUsageDescription这个key,Value可以为空,并调用此方法 5 [self.manager requestWhenInUseAuthorization]; 6 [self.manager startUpdatingLocation]; 7 }else{ 8 NSLog(@"IOS7"); 9 //开始获取用户位置 10 [self.manager startUpdatingLocation]; 11 }
接下来便需要实现一些代理方法来方便我们获取用户位置,以下为常用的部分代理协议
1.用户授权状态改变后调用
1 //在此判断授权状态并进行相对应的操作 2 - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{ 3 if (status == kCLAuthorizationStatusAuthorizedAlways || 4 status == kCLAuthorizationStatusAuthorizedWhenInUse) { 5 NSLog(@"授权成功"); 6 //授权成功后开始监听 获取位置 7 [self.manager startUpdatingLocation]; 8 } 9 }
2.在更新用户位置时调用的方法
1 //可以在这里进行反地理编码获取位置信息 2 - (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations{ 3 //反地理编码使用位置信息反编码 4 CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 5 CLLocation *newLocation = [locations lastObject]; 6 [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { 7 for (CLPlacemark *place in placemarks) { 8 //通过CLPlacemark可以输出用户位置信息 9 NSLog(@"%@ %@ %lf %lf",place.name, place.addressDictionary, place.location.coordinate.latitude,place.location.coordinate.longitude); 10 } 11 }]; 12 }
3.用户手机头部方向改变时调用的方法
1 //在更新用户头部方向时调用,适用方向指定操作 2 - (void)locationManager:(CLLocationManager *)managerdidUpdateHeading:(CLHeading *)newHeading
至此Corelocation的配置就已完成,接下来是关于地图配置的方法
地图控件的基本使用
首先要导入地图框架 #import <MapKit/MapKit.h>
设置地图控件属性,并懒加载实现及其属性配置
1 //地图控件,其中region属性个人觉得在代理中设置比较合适 2 @property (nonatomic, strong) MKMapView *mapView; 3 - (MKMapView *)mapView{ 4 if (_mapView == nil) { 5 _mapView = [[MKMapView alloc] initWithFrame:self.view.bounds]; 6 _mapView.delegate = self; 7 /* 8 MKUserTrackingModeNone = 0 默认不跟踪 9 MKUserTrackingModeFollow, 追踪位置 10 MKUserTrackingModeFollowWithHeading 追踪位置及其头部指向 11 */ 12 //用户追踪模型,如不设置将无法追踪用户 13 _mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading; 14 /* 15 MKMapTypeStandard = 0,普通模式(默认模式) 16 MKMapTypeSatellite, 卫星模式 17 MKMapTypeHybrid 混合模式 18 */ 19 _mapView.mapType = MKMapTypeStandard; 20 } 21 return _mapView; 22 }
最后将_mapView添加进self.view中,整个地图相当于就可以加载完成了。下面介绍MKMapView的一部分代理方法及其调用时机
1 #pragma mark - MKMapViewDelegate 代理方法 2 /** 3 * 更新用户位置是调用 4 * 5 * @param mapView 题图 6 * @param userLocation 用户位置 7 */ 8 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{ 9 NSLog(@"更新用户位置"); 10 //设置用户位置中心点 11 [self.mapView setCenterCoordinate:userLocation.coordinate animated:YES]; 12 //范围设置MKCoordinateSpanMake中的代表经纬度范围 13 MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.coordinate, MKCoordinateSpanMake(0.1, 0.1)); 14 //设置中心点范围 15 [self.mapView setRegion:region animated:YES]; 16 } 17 /** 18 * 地图将要开始渲染时调用 19 */ 20 - (void)mapViewWillStartRenderingMap:(MKMapView *)mapView{ 21 NSLog(@"%s",__func__); 22 } 23 /** 24 * 地图完成渲染时调用 25 */ 26 - (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered{ 27 NSLog(@"%s",__func__); 28 } 29 /** 30 * region(范围)即将改变时调用 31 */ 32 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated{ 33 NSLog(@"%s",__func__); 34 } 35 /** 36 * region(范围)完成改变时调用 37 */ 38 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ 39 NSLog(@"%s",__func__); 40 } 41 /** 42 * 追踪模型改变时调用 43 */ 44 - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated{ 45 NSLog(@"%s",__func__); 46 } 47 /** 48 * 设置大头针时调用 类似于tableViewCell设置 49 */ 50 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
51 //在其中设置MKAnnotationVIew,有重用机制
52}
另外还有其他一些代理方法就不一一介绍了,剩下的就看需要 在对应的方法里添加想进行的操作。