公海赌船网址  定位是一个很常用的功效,假如用户同意软件定位的话

一、简介

  定位是一个很常用的功用,如有的地形图软件打开未来假若用户同意软件定位的话,那么打开软件后就会活动锁定到当下职务,如若用户手机移动那么当前岗位也会跟随着变化。要实现这多少个职能需要运用Core
Loaction中CLLocationManager类。

一、简介

  定位是一个很常用的效应,如一些地图软件打开将来假若用户同意软件定位的话,那么打开软件后就会自动锁定到当下岗位,假若用户手机活动那么当前职务也会跟随着变化。要贯彻这个效果需要利用Core
Loaction中CLLocationManager类。

1. 稳住的莫过于行使场景:

  • 导航:去随便陌生的地方
  • 常见:找餐馆、找酒吧、找银行、找影院等

1. 固定的实际上接纳场景:

  • 导航:去随意陌生的地点
  • 科普:找餐馆、找酒吧、找银行、找影院等

2. 涉及技术:

  • Core Location 框架:用于地理定位。(单纯的原则性,不需要体现地图)

常用类:以CL前缀起头

CLLocation:(结构体类型)经纬度

CLLocationManager:  定位管理类,地方管理器,全局唯一设有,做固定用。 

CLLocationManagerDelegate: 
监听用户是否愿意定位(iOS8后要问),监听用户的职务(经纬度)

  • Map Kit 框架:用于地图呈现。(和地图结合的固定,如:百度地图、高德地图等)

常用类:以MK前缀起头

MKMapView: 展现地图视图

MKMapViewDelegate: 地图视图的商事(定位;地图视图移动;定位用户的地点)

2. 事关技术:

  • Core Location 框架:用于地理定位。(单纯的固定,不需要出示地图)

常用类:以CL前缀起头

CLLocation:(结构体类型)经纬度

CLLocationManager:  定位管理类,地点管理器,全局唯一设有,做固定用。 

CLLocationManagerDelegate: 
监听用户是否情愿定位(iOS8后要问),监听用户的岗位(经纬度)

  • Map Kit 框架:用于地图显示。(和地图结合的一定,如:百度地图、高德地图等)

常用类:以MK前缀起先

MKMapView: 展现地图视图

MKMapViewDelegate: 地图视图的商谈(定位;地图视图移动;定位用户的职务)

3. 专业术语:

  • LBS:Location Based
    瑟维斯(Service),基于地方的服务。(如,打车:基于地方提供了叫车服务。)
  • SoLoMo:Social Local
    Mobile(索罗(Thoreau)门),社交本地移动。(如,陌陌、微信、QQ)

3. 专业术语:

  • LBS:Location Based
    Service(Service),基于地点的劳务。(如,打车:基于地点提供了叫车服务。)
  • SoLoMo:Social Local
    Mobile(索罗(Thoreau)门),社交本地移动。(如,陌陌、微信、QQ)

4. iOS永恒的主意:(按一定准确性名次)

  • GPS(Global Positioning
    System,全球卫星定位系统)定位

  • 挪动基站/蜂窝/流量

  • wifi定位

4. iOS定位的不二法门:(按一定准确性名次)

  • GPS(Global Positioning
    System,全球卫星定位系统)定位

  • 活动基站/蜂窝/流量

  • wifi定位

二、用户隐私的保安

二、用户隐私的维护

1. 权力设置验证

  从iOS
6初步,苹果在维护用户隐私方面做了很大的增进,以下操作都不可能不透过用户许可授权

    (1)要想取得用户的职务

    (2)想拜会用户的通讯录、日历、相机、相册等

 
  当想访问用户的心事信息时,系统会自动弹出一个对话框让用户授权

  公海赌船网址 1

  注意:一旦用户挑选了“Don’t
Allow”,意味着你的应用未来就不可能运用固定效用,且当用户率先次采纳了后头,未来就再也不会提醒举办安装。

  由此在程序中应当展开判定,假若发现自己的永恒服务没有打开,那么应该提示用户打开定位服务效果。

  CLLocationManager有个类形式可以判断当前应用的固化功效是否可用+
(BOOL)locationServicesEnabled;

  常用的点子:截图告诉用户,应该怎么打开授权

1. 权力设置验证

  从iOS
6起首,苹果在维护用户隐私方面做了很大的加强,以下操作都必须经过用户许可授权

    (1)要想博得用户的职务

    (2)想拜会用户的通讯录、日历、相机、相册等

 
  当想访问用户的苦衷音讯时,系统会自动弹出一个对话框让用户授权

  公海赌船网址 2

  注意:一旦用户选用了“Don’t
Allow”,意味着你的利用将来就无法运用一定功用,且当用户率先次选用了后来,将来就再也不会指示进行设置。

  因而在程序中应有展开判定,假设发现自己的原则性服务没有打开,那么相应提拔用户打开定位服务效果。

  CLLocationManager有个类措施可以判断当前应用的永恒效率是否可用+
(BOOL)locationService(Service)sEnabled;

  常用的法门:截图告诉用户,应该怎么打开授权

2. 呼吁用户授权

  配置征求用户是否允许授权的弹出框:(在Info.plist里安排,添加相应的key
才能弹出授权框)

  • 一向授权:

  公海赌船网址 3  

  公海赌船网址 4 

  • 应用使用期间授权:

  公海赌船网址 5

  公海赌船网址 6

  • 修改plist配置,添加Key:

  公海赌船网址 7 

  公海赌船网址 8

2. 请求用户授权

  配置征求用户是否同意授权的弹出框:(在Info.plist里部署,添加相应的key
才能弹出授权框)

  • 始终授权:

  公海赌船网址 9  

  公海赌船网址 10 

  • 应用应用期间授权:

  公海赌船网址 11

  公海赌船网址 12

  • 修改plist配置,添加Key:

  公海赌船网址 13 

  公海赌船网址 14

3. 自定义模拟器的职务

  自定义一个地点模拟地方,写何地模拟器就觉得你在什么地方(定位就定在这时)

   公海赌船网址 15

3. 自定义模拟器的职位

  自定义一个岗位模拟地方,写哪里模拟器就觉着你在何方(定位就定在那时)

   公海赌船网址 16

二、CoreLocation框架的行使

二、CoreLocation框架的选取

1. 导入框架:CoreLocation.framework

1. 导入框架:CoreLocation.framework

2. 导入头文件:#import <CoreLocation/CoreLocation.h>

2. 导入头文件:#import <CoreLocation/CoreLocation.h>

3. CLLocationManager的常用操作:

  • 先导用户定位:- (void)startUpdatingLocation;
  • 截止用户定位:- (void)stopUpdatingLocation;
  • 当调用了startUpdatingLocation方法后,就从头频频地稳定用户的职位,中途会频繁地调用代理的下面方法:

    #pragma mark – CLLocationManagerDelegate 实现协议中的方法

    - (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations;

3. CLLocationManager的常用操作:

  • 发端用户定位:- (void)startUpdatingLocation;
  • 悬停用户定位:- (void)stopUpdatingLocation;
  • 当调用了startUpdatingLocation方法后,就起来随地地定位用户的职务,中途会频繁地调用代理的底下方法:

    #pragma mark – CLLocationManagerDelegate 实现协议中的方法

    - (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations;

 4. 永恒用户的职务:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h> // 导入头文件    
@interface ViewController () <CLLocationManagerDelegate>
// 声明一个属性帮助我们来定位,干什么都要问他
@property (nonatomic, strong) CLLocationManager *manager;
@end

@implementation ViewController
#pragma mark ---懒加载
-(CLLocationManager *)manager {
    if (_manager==nil) {
        // 1.创建位置管理器(定位用户的位置)
        _manager=[[CLLocationManager alloc]init];
        // 2.设置代理(设置谁来监听用户的位置)
        _manager.delegate=self;
    }
    return _manager;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // 请求用户授权
    // iOS8之后才开始征求用户同意,iOS8之前不用征求同意直接定位
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
  // 注意:iOS8之后要配置info.plist文件:添加key(NSLocationAlwaysUsageDescription / NSLocationWhenInUseUsageDescription),才能弹出授权框
     // 两种授权:始终(永久)授权、使用应用期间授权。
     // 注意:如果同时写了下面两种授权,程序打开的时候会出现两次授权提示。大多数情况下,我们根据程序的需求写一种授权方式就可以了。
        //1) 永久授权。无论当前程序在前台或后台都授权/都定位 (key:NSLocationAlwaysUsageDescription)
        //[self.manager requestAlwaysAuthorization]; //请求总是授权
        //2) 当用户正在使用的时候授权。只有程序在前台运行的时候才会授权(征求用户是否愿意只在前台定位) (key:NSLocationWhenInUseUsageDescription)
        [self.manager requestWhenInUseAuthorization]; //请求在使用时的授权(在前台),大多数APP使用的是这种授权
        
    } else {
        // 调用开始定位方法。直接定位(不需要征求用户同意) 定位里面干什么都要问manager
        [self.manager startUpdatingLocation];//开始定位
    }
}

#pragma mark - CLLocationManagerDelegate 实现协议中的方法
//1.查看用户是否同意(这个方法监听用户有没有点允许/不允许),用户同意了就调用第二个方法
/**
 *  @param status  用户授权的状态 (用户是否同意)
 *  常用的两个状态:
 *   1) kCLAuthorizationStatusDenied:用户不同意定位
 *      用户不允许自动定位时,可以手动选择城市定位(如:墨迹天气,用户手动选择一个城市,把城市的天气推送给你)
 *   2) kCLAuthorizationStatusAuthorizedWhenInUse:用户允许在使用期间(前台)定位
 */
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    //判断两种常用的授权状态
    switch (status) {
        case kCLAuthorizationStatusAuthorizedWhenInUse: //用户允许在使用期间(前台)定位
          // 实现持续定位,通常要做一些优化(目的是节省电量和流量)。
        // 1. 设置距离筛选器,当用户位置发生一定改变之后再调用代理方法2(避免调用太频繁)。
       // 当用户位置发生超过10米的变化,再重新开始定位(即调用代理方法2)
       self.manger.distanceFilter = 10; 
            // 2. 设置定位的精准度(常量值:kXXXBest最好的、十米范围内、百米范围内、千米范围内、三千米范围内)
            // 我们可以降低定位的精准度,实际上降低了与卫星之间的计算,以此节省电量和流量。精确度越高越费电量/流量,一般选十米/百米范围内为宜。
            self.manager.desiredAccuracy = kCLLocationAccuracyBest;//定位的精确度
            [self.manager startUpdatingLocation]; //开始定位操作
            break;
        case kCLAuthorizationStatusDenied: //用户不允许定位(第二种方案)
            NSLog(@"用户不允许定位!");
            break;
        default:
            break;
    }
}
//2.已经定位到用户的位置会调用这个方法
/**
 *  当完成位置更新的时候调用。当定位到用户的位置时,就会调用(调用的频率比较频繁)
 * 当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法
 *  @param locations 用户的位置(数组类型,最后一项是用户最新的位置;数组里至少有一项)
 */
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *location=[locations lastObject];//获取用户最新的位置
    NSLog(@"纬度:%f, 经度:%f", location.coordinate.latitude, location.coordinate.longitude); //打印获取用户位置的经纬度
    // 停止用户定位/停止更新位置(不停止,就会一直不停的定位,即持续定位;停止后该代理方法就不会再频繁调用,即一次定位)
    [self.manager stopUpdatingLocation]; 
    // Xcode7以下只定位一次(打印经纬度一次),Xcode7以上会定位三次(打印经纬度三次)
}

@end

 注意:假如发现自己的一向服务没有打开,那么相应提拔用户打开定位服务职能。定位服务是相比较耗电的,如即使做一定服务(没必要实时更新的话),那么一定了用户地方后,应该告一段落更新地点。

 4. 稳定用户的地点:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h> // 导入头文件    
@interface ViewController () <CLLocationManagerDelegate>
// 声明一个属性帮助我们来定位,干什么都要问他
@property (nonatomic, strong) CLLocationManager *manager;
@end

@implementation ViewController
#pragma mark ---懒加载
-(CLLocationManager *)manager {
    if (_manager==nil) {
        // 1.创建位置管理器(定位用户的位置)
        _manager=[[CLLocationManager alloc]init];
        // 2.设置代理(设置谁来监听用户的位置)
        _manager.delegate=self;
    }
    return _manager;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // 请求用户授权
    // iOS8之后才开始征求用户同意,iOS8之前不用征求同意直接定位
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
  // 注意:iOS8之后要配置info.plist文件:添加key(NSLocationAlwaysUsageDescription / NSLocationWhenInUseUsageDescription),才能弹出授权框
     // 两种授权:始终(永久)授权、使用应用期间授权。
     // 注意:如果同时写了下面两种授权,程序打开的时候会出现两次授权提示。大多数情况下,我们根据程序的需求写一种授权方式就可以了。
        //1) 永久授权。无论当前程序在前台或后台都授权/都定位 (key:NSLocationAlwaysUsageDescription)
        //[self.manager requestAlwaysAuthorization]; //请求总是授权
        //2) 当用户正在使用的时候授权。只有程序在前台运行的时候才会授权(征求用户是否愿意只在前台定位) (key:NSLocationWhenInUseUsageDescription)
        [self.manager requestWhenInUseAuthorization]; //请求在使用时的授权(在前台),大多数APP使用的是这种授权
        
    } else {
        // 调用开始定位方法。直接定位(不需要征求用户同意) 定位里面干什么都要问manager
        [self.manager startUpdatingLocation];//开始定位
    }
}

#pragma mark - CLLocationManagerDelegate 实现协议中的方法
//1.查看用户是否同意(这个方法监听用户有没有点允许/不允许),用户同意了就调用第二个方法
/**
 *  @param status  用户授权的状态 (用户是否同意)
 *  常用的两个状态:
 *   1) kCLAuthorizationStatusDenied:用户不同意定位
 *      用户不允许自动定位时,可以手动选择城市定位(如:墨迹天气,用户手动选择一个城市,把城市的天气推送给你)
 *   2) kCLAuthorizationStatusAuthorizedWhenInUse:用户允许在使用期间(前台)定位
 */
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    //判断两种常用的授权状态
    switch (status) {
        case kCLAuthorizationStatusAuthorizedWhenInUse: //用户允许在使用期间(前台)定位
          // 实现持续定位,通常要做一些优化(目的是节省电量和流量)。
        // 1. 设置距离筛选器,当用户位置发生一定改变之后再调用代理方法2(避免调用太频繁)。
       // 当用户位置发生超过10米的变化,再重新开始定位(即调用代理方法2)
       self.manger.distanceFilter = 10; 
            // 2. 设置定位的精准度(常量值:kXXXBest最好的、十米范围内、百米范围内、千米范围内、三千米范围内)
            // 我们可以降低定位的精准度,实际上降低了与卫星之间的计算,以此节省电量和流量。精确度越高越费电量/流量,一般选十米/百米范围内为宜。
            self.manager.desiredAccuracy = kCLLocationAccuracyBest;//定位的精确度
            [self.manager startUpdatingLocation]; //开始定位操作
            break;
        case kCLAuthorizationStatusDenied: //用户不允许定位(第二种方案)
            NSLog(@"用户不允许定位!");
            break;
        default:
            break;
    }
}
//2.已经定位到用户的位置会调用这个方法
/**
 *  当完成位置更新的时候调用。当定位到用户的位置时,就会调用(调用的频率比较频繁)
 * 当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法
 *  @param locations 用户的位置(数组类型,最后一项是用户最新的位置;数组里至少有一项)
 */
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *location=[locations lastObject];//获取用户最新的位置
    NSLog(@"纬度:%f, 经度:%f", location.coordinate.latitude, location.coordinate.longitude); //打印获取用户位置的经纬度
    // 停止用户定位/停止更新位置(不停止,就会一直不停的定位,即持续定位;停止后该代理方法就不会再频繁调用,即一次定位)
    [self.manager stopUpdatingLocation]; 
    // Xcode7以下只定位一次(打印经纬度一次),Xcode7以上会定位三次(打印经纬度三次)
}

@end

 注意:假诺发现自己的一向服务没有打开,那么相应提示用户打开定位服务功能。定位服务是相比较耗电的,假如是做一定服务(没必要实时更新的话),那么一定了用户地方后,应该截止更新地点。

5. 总计两点期间的直线距离

// 比较两个位置之间的距离(如,北京与西安的距离)
CLLocation *location1 = [[CLLocation alloc]initWithLatitude:40 longitude:116];
CLLocation *location2 = [[CLLocation alloc]initWithLatitude:34.27 longitude:108.93];
// 比较直线距离
CLLocationDistance distance = [location1 distanceFromLocation:location2];
NSLog(@"北京与西安的直线距离为:%f千米", distance / 1000);

5. 盘算两点期间的直线距离

// 比较两个位置之间的距离(如,北京与西安的距离)
CLLocation *location1 = [[CLLocation alloc]initWithLatitude:40 longitude:116];
CLLocation *location2 = [[CLLocation alloc]initWithLatitude:34.27 longitude:108.93];
// 比较直线距离
CLLocationDistance distance = [location1 distanceFromLocation:location2];
NSLog(@"北京与西安的直线距离为:%f千米", distance / 1000);

三、地理编码/反地理编码

三、地理编码/反地理编码

1. 简约表明:

    Geography(地理) +
code(编码),CLGeocoder:地理编码器,其中Geo是地理英文单词Geography的简写。

  • 地理编码:将地名 转换成
    经纬度的历程。
    给定一个地点名(城市/街道/省名字) —> 重临地址名所在的职位(经纬度)

  • 反地理编码
    (使用频率高):将经纬度 转换成 地名的经过。给定一个经纬度 —>
    重临该经纬度的详细消息(国家/省/城市/街道/店铺)

1. 简短表明:

    Geography(地理) +
code(编码),CLGeocoder:地理编码器,其中Geo是地理英文单词Geography的简写。

  • 地理编码:将地名 转换成
    经纬度的长河。
    给定一个地方名(城市/街道/省名字) —> 再次回到地址名所在的地点(经纬度)

  • 反地理编码
    (使用效能高):将经纬度 转换成 地名的经过。给定一个经纬度 —>
    再次来到该经纬度的详细音信(国家/省/城市/街道/店铺)

2. CLGeocoder 的使用:

    使用 CLGeocoder 可以形成“地理编码”和“反地理编码”

    公海赌船网址 17

2. CLGeocoder 的使用:

    使用 CLGeocoder 可以成功“地理编码”和“反地理编码”

    公海赌船网址 18

3. CLPlacemark 类常用属性:

@interface CLPlacemark : NSObject  //地标类
@property (nonatomic, readonly, copy) CLLocation *location; //地理位置,可以获取经纬度
@property (nonatomic, readonly, copy) NSDictionary *addressDictionary; //详细的地址信息

@property (nonatomic, readonly) CLRegion *region; //区域
@property (nonatomic, readonly) NSString *name; //地址名称
@property (nonatomic, readonly) NSString *locality; //城市

@end

3. CLPlacemark 类常用属性:

@interface CLPlacemark : NSObject  //地标类
@property (nonatomic, readonly, copy) CLLocation *location; //地理位置,可以获取经纬度
@property (nonatomic, readonly, copy) NSDictionary *addressDictionary; //详细的地址信息

@property (nonatomic, readonly) CLRegion *region; //区域
@property (nonatomic, readonly) NSString *name; //地址名称
@property (nonatomic, readonly) NSString *locality; //城市

@end

 4. 一体化代码:

// 1. 创建一个CLGeocoder对象
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 2. 开始地理编码
/**
 *  说明:调用下面的方法开始编码,不管编码是成功还是失败都会调用block中的方法
 *  给一个地名,返回一个block回调参数
 *  @param placemarks 地标数组,主要的是CLLocation / 城市属性
 */
[geocoder geocodeAddressString:@"下沙" completionHandler:^(NSArray *placemarks, NSError *error) {
    //1)如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到
    if (placemarks.count == 0 || error) {
        NSLog(@"你输入的地址没找到,可能在火星上");
    } else {
        //2)编码成功,找到了具体的位置信息
        /**
         *  遍历地表数组:
         *  这里数组中有一个/多个相关的位置信息对象(给一个名称,可能对应多个位置信息)
         */
        for (CLPlacemark *placemark in placemarks) {
         // 打印查看找到的所有的位置信息
            NSLog(@"详细地址名称:%@", placemark.name);
            NSLog(@"经纬度坐标:%.4f, %.4f" , placemark.location.coordinate.longitude, placemark.location.coordinate.latitude);
        }
        // 取得第一个地标,地标中存储了详细的地址信息,注意:一个地名可能搜索出多个地址
        CLPlacemark *placemark = [placemarks firstObject];
        //1>详细地址名称
        NSLog(@"详细地址名称:%@", placemark.name);
        //2>经纬度
        NSLog(@"经纬度坐标:%.4f, %.4f" , placemark.location.coordinate.longitude, placemark.location.coordinate.latitude);
    }
}];


// 1. 设置经纬度
CLLocation *location = [[CLLocation alloc]initWithLatitude:40 longitude:116];
// 2.开始反地理编码
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
    // 1)如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到
    if (placemarks.count == 0 || error) {
        NSLog(@"你输入的地址没找到,可能在火星上");
    } else {
        //2)编码成功
        //这里不用for循环遍历,因为数组中只有唯一的一个对象(经纬度一定,地名也一定),直接取出即可
        CLPlacemark *placemark = [placemarks firstObject];
        self.reverseDetailAddressLabel.text = placemark.name;
        NSLog(@"详细地址名称:%@", placemark.addressDictionary[@"FormattedAddressLines"]);
    }
}];

 4. 完全代码:

// 1. 创建一个CLGeocoder对象
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 2. 开始地理编码
/**
 *  说明:调用下面的方法开始编码,不管编码是成功还是失败都会调用block中的方法
 *  给一个地名,返回一个block回调参数
 *  @param placemarks 地标数组,主要的是CLLocation / 城市属性
 */
[geocoder geocodeAddressString:@"下沙" completionHandler:^(NSArray *placemarks, NSError *error) {
    //1)如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到
    if (placemarks.count == 0 || error) {
        NSLog(@"你输入的地址没找到,可能在火星上");
    } else {
        //2)编码成功,找到了具体的位置信息
        /**
         *  遍历地表数组:
         *  这里数组中有一个/多个相关的位置信息对象(给一个名称,可能对应多个位置信息)
         */
        for (CLPlacemark *placemark in placemarks) {
         // 打印查看找到的所有的位置信息
            NSLog(@"详细地址名称:%@", placemark.name);
            NSLog(@"经纬度坐标:%.4f, %.4f" , placemark.location.coordinate.longitude, placemark.location.coordinate.latitude);
        }
        // 取得第一个地标,地标中存储了详细的地址信息,注意:一个地名可能搜索出多个地址
        CLPlacemark *placemark = [placemarks firstObject];
        //1>详细地址名称
        NSLog(@"详细地址名称:%@", placemark.name);
        //2>经纬度
        NSLog(@"经纬度坐标:%.4f, %.4f" , placemark.location.coordinate.longitude, placemark.location.coordinate.latitude);
    }
}];


// 1. 设置经纬度
CLLocation *location = [[CLLocation alloc]initWithLatitude:40 longitude:116];
// 2.开始反地理编码
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
    // 1)如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到
    if (placemarks.count == 0 || error) {
        NSLog(@"你输入的地址没找到,可能在火星上");
    } else {
        //2)编码成功
        //这里不用for循环遍历,因为数组中只有唯一的一个对象(经纬度一定,地名也一定),直接取出即可
        CLPlacemark *placemark = [placemarks firstObject];
        self.reverseDetailAddressLabel.text = placemark.name;
        NSLog(@"详细地址名称:%@", placemark.addressDictionary[@"FormattedAddressLines"]);
    }
}];

四、Map基特框架的运用(和地图结合的稳定)

四、Map基特(Kit)框架的使用(和地图结合的固化)

1. 导入框架:Map基特.framework

1. 导入框架:Map基特(Kit).framework

2. 导入头文件:#import <MapKit/MapKit.h>

2. 导入头文件:#import <MapKit/MapKit.h>

3. 经纬度:

 公海赌船网址 19

3. 经纬度:

 公海赌船网址 20

4. MapView的使用:

  Map基特中有一个比较关键的UI控件:MKMapView,专门用于地图显示。

  公海赌船网址 21

  • 兑现和地图结合的固化:

    #import “ViewController.h”
    #import

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet MKMapView mapView;
    @property (nonatomic, strong) CLLocationManager
    manager;
    @end

    @implementation ViewController

    • (void)viewDidLoad {
          [super viewDidLoad];
          // 初始化manager
          self.manager = [[CLLocationManager alloc]init];
          // 请求授权:征求用户同意(假定同意,在targets–>Info/Info.plist中添加key)
      if ([self.manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

        [self.manager requestWhenInUseAuthorization];
      

      }
          //设置地图视图的代办
          self.mapView.delegate = self;
        // 设置地图的性能
          self.mapView.rotateEnabled = NO;//设置不容许旋转
          self.mapView.mapType = MKMapTypeHybrid;//地图的彰显档次(混合类型,默认是Standard类型)
          // 设定地图属性(开首稳定/已经把用户的职务显得在地形图上)
          // 用户的跟踪情势,地图视图的跟踪形式是跟随着用户的地点而转变,当前地图一定会来得用户的岗位
          self.mapView.userTrackingMode=MKUserTrackingModeFollow;
          
      }
      #pragma mark – MKMapViewDelegate 协议
      // 完成用户地点更新的时候调用,已经稳定到用户的地点调用这多少个办法
      -(void)mapView:(MKMapView )mapView didUpdateUserLocation:(MKUserLocation )userLocation {
        // 已经固定到用户的职位
          NSLog(@”location:%f, %f”,userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
        userLocation.title = @”用户地方-标题”;
        userLocation.subtitle = @”用户地方-子标题”;
        // 这里可以因而反地理编码把经纬度转成地名,用户点击时就足以显得用户位置的唤起。
      }

    @end

 公海赌船网址 22

4. MapView的使用:

  Map基特(Kit)中有一个相比关键的UI控件:MKMapView,专门用来地图展现。

  公海赌船网址 23

  • 贯彻和地图结合的定点:

    #import “ViewController.h”
    #import

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet MKMapView mapView;
    @property (nonatomic, strong) CLLocationManager
    manager;
    @end

    @implementation ViewController

    • (void)viewDidLoad {
          [super viewDidLoad];
          // 初始化manager
          self.manager = [[CLLocationManager alloc]init];
          // 请求授权:征求用户同意(假定同意,在targets–>Info/Info.plist中添加key)
      if ([self.manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

        [self.manager requestWhenInUseAuthorization];
      

      }
          //设置地图视图的代办
          self.mapView.delegate = self;
        // 设置地图的性能
          self.mapView.rotateEnabled = NO;//设置不同意旋转
          self.mapView.mapType = MKMapTypeHybrid;//地图的显得档次(混合类型,默认是Standard类型)
          // 设定地图属性(开端定点/已经把用户的职务显得在地图上)
          // 用户的跟踪形式,地图视图的跟踪形式是跟随着用户的岗位而变更,当前地图一定会呈现用户的职位
          self.mapView.userTrackingMode=MKUserTrackingModeFollow;
          
      }
      #pragma mark – MKMapViewDelegate 协议
      // 完成用户地方更新的时候调用,已经定位到用户的职位调用这么些措施
      -(void)mapView:(MKMapView )mapView didUpdateUserLocation:(MKUserLocation )userLocation {
        // 已经固定到用户的地方    NSLog(@”location:%f, %f”,userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
        userLocation.title = @”用户地点-标题”;
        userLocation.subtitle = @”用户地方-子标题”;
        // 这里可以通过反地理编码把经纬度转成地名,用户点击时就足以显得用户地点的唤起。
      }

    @end

 公海赌船网址 24

5. 赶回用户的地点(主题点回来原先的岗位、跨度和原来保持一致)

  公海赌船网址 25

  公海赌船网址 26

 

 

5. 回去用户的职位(中央点回来原先的地方、跨度和原先保持一致)

  公海赌船网址 27

  公海赌船网址 28

 

 

相关文章