2016-01-22 08:18:46 fuzongjian 阅读数 2002

<span style="font-family:Arial, Helvetica, sans-serif;font-size:18px;">一、判断应用是否打开定位服务</span>
<span style="font-family: Arial, Helvetica, sans-serif;">#pragma mark ---  是否打开了定位服务</span>

-(void)isOpenBmkLocationService:(void(^)(BOOL state))completion{
    
    if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways
         || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse)) {
            
            completion(YES);
            NSLog(@"已经打开了定位服务")
            
        }
    else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){
        [SVProgressHUD showErrorWithStatus:@"请在iPhone的\"设置-隐私-定位服务\"中允许访问位置信息"];
        NSLog(@"定位功能不可用");
    }
}

二、地理位置反编码

头文件

#import <BaiduMapAPI_Search/BMKGeocodeSearch.h>

编码

/**
 *  地理位置反编码
 *
 *  @param completion 城市名
 */
-(void)BaiDuMapGeoCodeSearch:(getCityName)cityBlock{
    
    self.block = cityBlock;
    
    _codeSearch = [[BMKGeoCodeSearch alloc] init];
    /**
     *  用完之后nil掉,会影响内存释放
     */
    _codeSearch.delegate = self;
    /**
     *  初始化逆地理编码类
     */
    BMKReverseGeoCodeOption * codeOption = [[BMKReverseGeoCodeOption alloc] init];
    /**
     *  需要逆地理编码的坐标位置(经纬度)
     */
    codeOption.reverseGeoPoint = self.location;
    [_codeSearch reverseGeoCode:codeOption];
    
}
-(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{
    
    if (self.block && [result.addressDetail.city length]) {
        self.block(result.addressDetail.city);
    }
}

三、地理位置正编码

代理的引用与释放

-(void)viewWillAppear:(BOOL)animated{
    [self.mapView viewWillAppear];
    self.mapView.delegate = self;
     _codeSearch.delegate = self;
}
-(void)viewWillDisappear:(BOOL)animated{
    [self.mapView viewWillDisappear];
    self.mapView.delegate = nil;
    self.codeSearch.delegate = nil;
}
编码

-(void)BaiDuMapGeoCodeSearch:(MapViewBlock)mapBlock{
    
    _codeSearch = [[BMKGeoCodeSearch alloc] init];
    
    BMKGeoCodeSearchOption * codeOption = [[BMKGeoCodeSearchOption alloc] init];
    
//    codeOption.city = @"杭州市";
    codeOption.address = @"需要编码的地理位置";
    
    
    [self.codeSearch geoCode:codeOption];
    
    self.block = mapBlock;
}
-(void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{
    
    if (self.block && result.location.longitude != 0.0) {
        
        self.block(result.location);
        
    }
    
}
调用后的显示

头文件

#import <BaiduMapAPI_Map/BMKAnnotation.h>
#import <BaiduMapAPI_Map/BMKPointAnnotation.h>
#import <BaiduMapAPI_Map/BMKPinAnnotationView.h>

[self BaiDuMapGeoCodeSearch:^(CLLocationCoordinate2D coordinate) {
        //显示位置
        self.mapView.centerCoordinate = coordinate;
        //添加标记
        [self createPointAnnotationWithCoordinate:coordinate];
        
    }];
/**
 *  只有在添加大头针的时候才会调用
 */
-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation{
    
    if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
        BMKPinAnnotationView * annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation"];
        annotationView.pinColor = BMKPinAnnotationColorPurple;
        // 从天上掉下效果
        annotationView.animatesDrop = YES;
        // 不可拖拽
        annotationView.draggable = YES;
        return annotationView;
    }
    
    return nil;
}
/**
 *  添加一个大头针 显示用户位置
 *
 *  @param location
 */
-(BMKPointAnnotation *)createPointAnnotationWithCoordinate:(CLLocationCoordinate2D)coordate{
    BMKPointAnnotation * point = [[BMKPointAnnotation alloc] init];
    point.coordinate = coordate;
    [self.mapView addAnnotation:point];
    return point;
}




2016-02-29 11:05:51 FTD1120 阅读数 2474

一. CoreLocation

实现一次定位

  1. 创建CLLocationManager对象
  2. 请求用户授权 –> 从iOS8开始, 必须在程序中请求用户授权, 除了写代码, 还要配置plist’列表的键值
  3. 设置代理 –> 获取用户位置
  4. 调用开始定位方法
  5. 代理方法中停止定位

2. 实现持续定位

  1. 距离筛选器 –> 位置发生了一定的改变之后, 才去调用代理方法 降低方法的调用来达到省电的目的
  2. 定位精准度 –> 降低通讯及计算的过程就可以省电

3. CLLocation对象介绍

  1. 位置对象, 最核心的就是经纬度, coordinate : 2D位置坐标 –> 经纬度
  2. 创建一个位置对象, 最少只需要两个值, 经纬度
  3. 比较两个位置之间的距离: distanceFromLocation , 返回的是直线距离

4. 请求用户授权

  1. 如果要授权, 从iOS8开始, 必须在程序中请求用户授权, 除了写代码, 还要配置plist列表的键值
  2. 授权方式 –>requestWhenInUseAuthorization 当用户使用的使用授权
    –>requestAlwaysAuthorization 永久授权方法
  3. 一定要记得授权方法和plist列表匹配 (when / always)
    NSLocationWhenInUseUsageDescription
    NSLocationAlwaysUsageDescription

  4. 如果2个方法都写, 会出现2此授权的情况 (第一次会走第一个方法, 第二次会走第二个方法 –> 一般使用1个方法即可

  5. 大部分的程序之使用 “使用期间” 这个授权即可. 如果说列表出出现了3个, 说明两个授权方法写了

  6. plist的Value 可以不写, 写上是为了提示用户, 当前程序会在哪些地方使用定位. 建议写上, 提高用户打开的几率

5. iOS9新特性-临时获取后台定位权限

使用场景:当程序使用 “requestWhenInUseAuthorization” , 如果想要临时开启后台定位, 那么才需要使用新增的属性
1. allowsBackgroundLocationUpdates: 设置为YES即可, 还要配置plist列表 Required background modes : App registers for location updates

二. Geocoder

1. 正地理编码

正地理编码: 将地名 转换成 经纬度 的过程
1. 创建一个CLGeocoder对象
2. 实现地理编码方法
3. 遍历数组, 获取数据
注意: 地理编码 可能出现重名的问题, 所以将来如果对标对象大于1, 应该给用户一个列表选择

2. 反地理编码

反地理编码: 将经纬度 转换成 地名 的过程
1. 创建一个CLGeocoder对象
2. 创建一个CLLoction对象
3. 实现反地理编码方法
4. 遍历数组, 获取数据

三. MapView的基本使用

1. 显示用户位置

  1. CLLocationManager授权
  2. userTrackingMode: 设置跟踪模式

2. 设置地图显示类型

  1. mapType : 设置地图类型 , 一般要使用默认, 要么使用混合, 单纯的卫星图没有意义.

3. 根据用户位置显示对应的大头针信息

  1. 请参照反地理编码知识来设置userLocation 的相关属性即可

4. 设置以用户所在位置为中心点

  1. 设置中心点坐标: centerCoordinate
  2. 设置范围的属性: region 可以改变坐标, 也可以改变显示跨度
  3. 如果想要变化时有动画: 调用set方法, 增加动画

5. 获取地图显示区域改变时的中心点坐标及显示跨度

实现放大和缩小地图的效果
1. Delta 跨度倍数处理
2. 重设region属性

6. iOS9新特性-显示交通状况 / 显示比例 / 显示指南针

  1. 设置交通状况
  2. 设置指南针(默认就是YES)
  3. 设置比例尺

四. 大头针的使用

1. 添加大头针

  1. 添加大头针 –> 需要自定义大头针模型类
    1. 导入框架 MapKit
    2. 遵守协议 MKAnnotation
    3. 设置属性 直接去协议中拷贝–>删掉readonly
  2. 创建大头针
  3. 添加到地图上

2. 自定义大头针

a. 更改颜色, 设置掉落效果
  1. 如果发现是显示用户位置的大头针模型, 就返回nil
  2. 自定义大头针View –> 跟Cell的创建几乎一样
    —需要使用一个子类: MKPinAnnotationView : 子类是默认有View的–
  3. 设置颜色
  4. 设置动画掉落
b.更改大头针的图像
设置图像
  1. 修改模型类, 增加属性
  2. 在创建模型类的时候, 去设置相关属性icon
  3. 在自定义大头针View的方法中设置图像 –> MVC
动画掉落
  1. 处理显示用户位置的大头针View, 不要增加动画
  2. 记录原本的位置
  3. 将View的Y值改为0, 重设Frame
  4. 将位置还原, 执行动画效果

4. 自定义大头针的代码封装

额外属性介绍
  1. 设置可以点击呼唤出来之前设置的标题子标题
  2. 设置左边 / 右边 / 详情 附属视图
封装大头针
  1. 封装大头针View, –> 跟封装cell的过程几乎一样, 唯一一个地方不一样的是, 可以不用设置模型属型

2.系统会自动调用该方法 annotation 的 set方法
1. 必须调用父类方法
2. 设置图像

最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧

github地址: https://github.com/FuThD

2018-04-17 10:59:33 iotjin 阅读数 108


#import <MapKit/MapKit.h>

<CLLocationManagerDelegate>



 //授权

    if ([CLLocationManagerlocationServicesEnabled] && ([CLLocationManagerauthorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse || [CLLocationManagerauthorizationStatus] == kCLAuthorizationStatusAuthorizedAlways )){

        //授权成功之后,定位功能可用

        

    }

    

    elseif ([CLLocationManagerauthorizationStatus] ==kCLAuthorizationStatusDenied ) {

        //定位不能用

        NSLog(@" 定位功能不可用,提示用户或忽略 ");

// @"允许\"定位\"提示"

        UIAlertController * alertVC = [UIAlertControlleralertControllerWithTitle:@"允许\"定位\"提示" message:@"请在设置中打开定位" preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction * ok = [UIAlertActionactionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnull action) {

            

            //打开app定位设置

            NSURL *settingsURL = [NSURLURLWithString:UIApplicationOpenSettingsURLString];

            [[UIApplication sharedApplication] openURL:settingsURL];

        }];

        UIAlertAction * cancel = [UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:^(UIAlertAction *_Nonnull action) {

            

        }];

        [alertVC addAction:cancel];

        [alertVC addAction:ok];

        [selfpresentViewController:alertVC animated:YEScompletion:nil];

        

        

        

    }

2014-10-14 11:31:06 chenhening 阅读数 492

1.由于IOS8中定位的授权机制改变,需要进行手动授权

//声明变量CLLocationManager,一定要在.h文件中声明,否则会出现授权提示框不出现或者闪过的问题。

  1. @property (nonatomic, strong) CLLocationManager  *locationManager;

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {

        CLLocationManager  *locationManager = [[CLLocationManager alloc] init];

       //获取授权认证

       [locationManager requestAlwaysAuthorization];

       [locationManager requestWhenInUseAuthorization];

 }

2.在info.plist中加入键值对
NSLocationAlwaysUsageDescription=YES
NSLocationWhenInUseUsageDescription=YES

3.如果还是不行,更新地图key,重新生成.

2014-12-10 17:03:41 wangLongBlog 阅读数 744

iOS8修改了位置设置里的内容,增加了一套状态(使用中可用/通常可用),所以以前的CLLcationManage的注册后, 

Delegate接口不响应了。 

  iOS8需要这么设置 

第一步 

    location = [[CLLocationManager alloc] init]; 

location.delegate= self; 

[locationrequestAlwaysAuthorization]; 

第二步 

在Plist中追加下面两个字段 (必须有,最少一个,内容是系统ALert的文言,文言可为空) 

第三步 

有了新的Delegate方法。 

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 

    switch (status) { 

casekCLAuthorizationStatusNotDetermined: 

            if ([location respondsToSelector:@selector(requestAlwaysAuthorization)]) { 

[locationrequestAlwaysAuthorization]; 

            } 

            break

        default

            break

 

 

    } 

}

iOS 地图

阅读数 409

iOS——地图

阅读数 139

iOS8,更改了定位的授权,所以在z

博文 来自: beyond521t
没有更多推荐了,返回首页