1、导包和配置文件
(1)Info.plist文件设置访问权限
(2)点击项目,在General中添加包
2、Location获取当前位置坐标
(1)声明和关联控件
@interface LocationViewController ()<CLLocationManagerDelegate>//位置管理者@property (nonatomic,strong)CLLocationManager *manager;@property (weak, nonatomic) IBOutlet UILabel *lab1;@property (weak, nonatomic) IBOutlet UILabel *lab2;@property (weak, nonatomic) IBOutlet UILabel *lab3;@end
(2)初始化
@implementation LocationViewController- (void)viewDidLoad {[super viewDidLoad];[self location];}- (CLLocationManager *)manager{if (!_manager) {_manager = [[CLLocationManager alloc] init];}return _manager;}
(3)定位
-(void)location{//1、创建位置管理器//向用户请求我们的程序使用位置[self.manager requestAlwaysAuthorization];[self.manager requestWhenInUseAuthorization];//设置定位的更新距离(10米)self.manager.distanceFilter = 10.0f;//设置代理self.manager.delegate = self;//开启定位功能[self.manager startUpdatingLocation];}
(4)获取位置与编码
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{//获得当前最新位置CLLocation *location = (CLLocation *)[locations lastObject];double lat = location.coordinate.latitude;double lon = location.coordinate.longitude;NSString *str1 = [NSString stringWithFormat:@\" %f\",lat];NSString *str2 = [NSString stringWithFormat:@\" %f\",lon];_lab1.text = str1;_lab2.text = str2;//反地理编码实现所在城市显示//1、创建一个CLGecoder对象CLGeocoder *geocoder = [CLGeocoder new];//2、实现反地理编码方法[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {//3.1、预防处理if (placemarks.count == 0 || error) {NSLog(@\"解析没有数据或者出错\");return;}for (CLPlacemark *placemark in placemarks) {NSString *str3 = [NSString stringWithFormat:@\"%@,%@\",placemark.locality,placemark.name];self.lab3.text = str3;}}];}
(5)停止定位
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{[self.manager stopUpdatingLocation];}
(6)实际效果
3、Map地图的定位、放大缩小以及地图样式
(1)声明和绑定控件
@interface MapViewController ()<MKMapViewDelegate>@property (retain, nonatomic) IBOutlet MKMapView *mapView;@property(nonatomic,strong)CLLocationManager *mgr;@end
(2)位置管理器
//1、创建位置管理器self.mgr = [CLLocationManager new];//2、请求授权 -->plistif ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {[self.mgr requestWhenInUseAuthorization];}//3、设置显示用户位置self.mapView.userTrackingMode = MKUserTrackingModeFollow;//4、设置代理-->获取用户位置self.mapView.delegate = self;
(3)地图样式切换
- (IBAction)mapTypeChangeClick:(UISegmentedControl *)sender {// MKMapTypeStandard = 0, 默认// MKMapTypeSatellite, 卫星// MKMapTypeHybrid, 混合// MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0),// MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0),// MKMapTypeMutedStandard NS_ENUM_AVAILABLE(10_13, 11_0) __TVOS_AVAILABLE(11_0),switch (sender.selectedSegmentIndex) {case 0:self.mapView.mapType = MKMapTypeStandard;break;case 1:self.mapView.mapType = MKMapTypeSatellite;break;case 2:self.mapView.mapType = MKMapTypeHybrid;break;default:break;}}
(4)完成用户位置更新的时候,调用MKUserLocation:大头针模型
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{//显示大头针信息 -->反地理编码实现//1、创建一个CLGecoder对象CLGeocoder *geocoder = [CLGeocoder new];//2、实现反地理编码方法[geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {//3.1、预防处理if (placemarks.count == 0 || error) {return;}//3.2、获取对象CLPlacemark *placemark = placemarks.lastObject;//3.3、设置标题为城市信息userLocation.title = placemark.locality;//3.4设置子标题为详细地址userLocation.subtitle = placemark.name;}];}
(6)返回用户所在位置
- (IBAction)backUserLocationClick:(id)sender{//1、设置中心点坐标// self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;//2、设置范围属性//2.1、获取坐标CLLocationCoordinate2D coordinate = self.mapView.userLocation.location.coordinate;//2.2设置显示范围MKCoordinateSpan span = MKCoordinateSpanMake(0.028219, 0.017767);//设置范围方法,可以设置动画[self.mapView setRegion:MKCoordinateRegionMake(coordinate, span)animated:YES];}//当地图显示区域发生改变后,会调用的方法-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{//获取默认的显示大小 --> spanNSLog(@\"latitudeDelta:%f,longitudeDelta:%f\",mapView.region.span.latitudeDelta,mapView.region.span.longitudeDelta);}
(7)放大地图
- (IBAction)zoomIn:(id)sender{//1、Delta缩小一倍CGFloat latitude = self.mapView.region.span.latitudeDelta * 0.5;CGFloat longitude = self.mapView.region.span.longitudeDelta * 0.5;//2、重设region值[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.region.center, MKCoordinateSpanMake(latitude, longitude))animated:YES];}
(8)缩小地图
- (IBAction)zoomOut:(id)sender{//1、Delta扩大一倍CGFloat latitude = self.mapView.region.span.latitudeDelta * 2;CGFloat longitude = self.mapView.region.span.longitudeDelta * 2;//2、重设region值[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.region.center, MKCoordinateSpanMake(latitude, longitude))animated:YES];}
(9)实际效果