最终效果图:
一, plist及frame的配置
1 ,info.plist文件中添加 Privacy - Location When In Use Usage Description(需要时开启定位,另一个是Privacy - Location Always Usage Description 一直开启定位)。
2, 添加framework框架,MapKit.framework与CoreLocation.framework,并分别在需要定位的视图中导入头文件:CoreLocation/CoreLocation.h 与 MapKit/MapKit.h
二,开启定位
1, 在项目中加入代理协议:CLLocationManagerDelegate,MKMapViewDelegate
@interface ViewController : UIViewController
@property (nonatomic,strong) CLLocationManager *locationManager;
@property (nonatomic,strong) CLGeocoder *geocoder;
@property (nonatomic,strong) MKMapView *mapViewL;
@end
2, 实现代理协议并开启定位
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.geocoder = [[CLGeocoder alloc]init];
self.placeDic = [[NSDictionary alloc]init];
MKUserLocation *userLOCation = [[MKUserLocation alloc]init];
_userLOcation = userLOCation;
[self startLocationForYou];
_placeLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 300, 50)];
[self.view addSubview:_placeLabel];
_mapViewL = [[MKMapView alloc]initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, self.view.bounds.size.height - 200)];
_mapViewL.delegate = self;
[self.view addSubview:_mapViewL];
_mapViewL.userTrackingMode = MKUserTrackingModeFollow;
_mapViewL.mapType = MKMapTypeStandard;
}
//开始定位
- (void)startLocationForYou{
if (![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse){
NSLog(@"定位功能已经打开");
[_locationManager requestWhenInUseAuthorization];
}
//调用定位信息
[self.locationManager startUpdatingLocation];
}
3, 获得用户当前经纬度
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location = [locations lastObject];
CLLocationCoordinate2D coord = location.coordinate;
// NSLog(@"经度:%f 纬度:%f 海拔: %f 航向:%f 速度:%f",coord.longitude,coord.latitude,location.altitude,location.course,location.speed);
[self getGeocoder:coord.longitude Atitude:coord.latitude];
// [manager stopUpdatingLocation];
}
三, 根据经纬度通过地理反编码得到当前街道信息
- (void)getGeocoder:(CLLocationDegrees )longitude Atitude:(CLLocationDegrees )atitude{
CLLocation *location = [[CLLocation alloc]initWithLatitude:atitude longitude:longitude];
[_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark *placeMark = [placemarks firstObject];
// if (self.placeDic.count == 0){
self.placeDic = placeMark.addressDictionary;
[self labelView:_placeDic[@"FormattedAddressLines"][0]];
// NSLog(@"详细地址:%@ ==== ",placeMark.addressDictionary);
// }
}];
}
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
if (error.code == kCLErrorDenied) {
NSLog(@"Error:%@",error);
// 提示用户出错原因,可按住Option键点击 KCLErrorDenied的查看更多出错信息,可打印error.code值查找原因所在
}
}
四, 显示地图并对当前用户位置进行定位跟随
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self startLocationForYou];
_mapViewL.userTrackingMode = MKUserTrackingModeFollow;
MKCoordinateSpan span = MKCoordinateSpanMake(0.002, 0.002);
MKCoordinateRegion regin = MKCoordinateRegionMake(_userLOcation.location.coordinate, span);
[_mapViewL setRegion:regin animated:YES];
}
- (void)labelView:(NSString *)placeLabel{
self.placeLabel.text = placeLabel;
self.placeLabel.numberOfLines = 0;
self.placeLabel.font = [UIFont systemFontOfSize:15];
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
_userLOcation = userLocation;
//Setting area
MKCoordinateSpan span = MKCoordinateSpanMake(0.002, 0.002);
MKCoordinateRegion regin = MKCoordinateRegionMake(userLocation.location.coordinate, span);
[_mapViewL setRegion:regin animated:YES];
}
@end