百度SDK实战Demo(获取实时定位状态)

地图的功能几乎每个App都会用到. 特别是有定位功能的app,从开发到现在,地图功能基本是我常用到的.我就抽空总结一下近 3年多的地图使用经验.

1:关于第三方SDK无法获取定位 状态改变的问题

        关于这个SDK的地图的坑,我至今都没有找到直接的解决方法, 而是采用 规避的方法解决这个问题. 由于我以前公司项目 同时 用到了百度SDK,高德导航(SDK),谷歌SDK.更别说 能拿到定位状态改变了. 有时人为的关掉定位功能.更无法判断.

我的解决方法是 用 ios 原生的 定位功能. 理由是第三方SDK都是在原生的基础上封装好的.地图的集成我就不多说了.上代码.

第1步:导入头文件和 签协议

第2步:初始化 

 //!定位管理

@property (nonatomic, strong) CLLocationManager *locationManager;

#pragma mark - ======================

- (CLLocationManager *)locationManager

{

if (!_locationManager)

{

_locationManager = [[CLLocationManager alloc] init];

_locationManager.delegate = self;

// 设置定位精度

_locationManager.desiredAccuracy = kCLLocationAccuracyBest;

// 定位频率,每隔多少米定位一次

_locationManager.distanceFilter = kCLDistanceFilterNone;

}

return _locationManager;

}



再视图加载完成这里 调用这句话.去用懒加载方式初始化 原生定位 管理器

接下来 当你运行时,这个界面出现时,会走 原生的代理协议方法

在定位成功前会做一个判断 实时定位状态的协议方法

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

{

if(status == kCLAuthorizationStatusAuthorizedWhenInUse){

XYLLog(@"使用");

[self.locationManager startUpdatingLocation];

}else if(status == kCLAuthorizationStatusDenied){

XYLLog(@"不使用");

[self.locationManager requestWhenInUseAuthorization];

}

}


这个是手机设备采集到的 GPS做标,如果项目集成了 百度SDK 建议进行地图纠偏处理

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{

XYLLog(@"定位失败");

}

当定位成功后,那到 纠偏后的经纬度, 我们要填加 定位点,显示出来. 原生的定位点 没有第三方的样式多.只有自己自定义

我上代码: 

继承 BMKAnnotationView ,这是自定义的, m 文件的实现


//  XYLFenceMapAnnotationView.m//  XYLBaiduMap2017////  Created by 夏玉林 on 17/2/16.//  Copyright © 2017年 夏玉林. All rights reserved.//#import "XYLFenceMapAnnotationView.h"@interface XYLFenceMapAnnotationView()@property (nonatomic, strong) CALayer *colorDotLayer;@property (nonatomic, strong) CALayer *outerDotLayer;@end@implementation XYLFenceMapAnnotationView//!外圈- (CALayer*)outerDotLayer {    if(!_outerDotLayer) {        _outerDotLayer = [CALayer layer];        _outerDotLayer.bounds = self.bounds;        _outerDotLayer.contents = (id)[self circleImageWithColor:self.outerColor height:self.bounds.size.height].CGImage;        _outerDotLayer.position = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);        _outerDotLayer.contentsGravity = kCAGravityCenter;        _outerDotLayer.contentsScale = [UIScreen mainScreen].scale;        _outerDotLayer.shadowColor = [UIColor blackColor].CGColor;        _outerDotLayer.shadowOffset = CGSizeMake(0, 2);        _outerDotLayer.shadowRadius = 3;        _outerDotLayer.shadowOpacity = 0.3;        _outerDotLayer.shouldRasterize = YES;        _outerDotLayer.rasterizationScale = [UIScreen mainScreen].scale;    }    return _outerDotLayer;}//!内圈- (CALayer*)colorDotLayer{    if(!_colorDotLayer)    {        _colorDotLayer = [CALayer layer];        CGFloat width = self.bounds.size.width-6;        _colorDotLayer.bounds = CGRectMake(0, 0, width, width);        _colorDotLayer.allowsGroupOpacity = YES;        _colorDotLayer.backgroundColor = self.annotationColor.CGColor;        _colorDotLayer.cornerRadius = width/2;        _colorDotLayer.position = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {                        if(self.delayBetweenPulseCycles != INFINITY) {                CAMediaTimingFunction *defaultCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];                                CAAnimationGroup *animationGroup = [CAAnimationGroup animation];                animationGroup.duration = self.pulseAnimationDuration;                animationGroup.repeatCount = INFINITY;                animationGroup.removedOnCompletion = NO;                animationGroup.autoreverses = YES;                animationGroup.timingFunction = defaultCurve;                animationGroup.speed = 1;                animationGroup.fillMode = kCAFillModeBoth;                                CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"];                pulseAnimation.fromValue = @0.8;                pulseAnimation.toValue = @1;                pulseAnimation.duration = self.pulseAnimationDuration;                                CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];                opacityAnimation.fromValue = @0.8;                opacityAnimation.toValue = @1;                opacityAnimation.duration = self.pulseAnimationDuration;                                animationGroup.animations = @[pulseAnimation, opacityAnimation];                                dispatch_async(dispatch_get_main_queue(), ^(void) {                    [_colorDotLayer addAnimation:animationGroup forKey:@"pulse"];                });            }        });            }    return _colorDotLayer;}#pragma mark - =====================UIView方法====================- (id)initWithAnnotation:(id)annotation reuseIdentifier:(NSString *)reuseIdentifier

{

self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];

if (self)

{

#pragma mark============在这里修改定位点的 frame===============

self.bounds = CGRectMake(0, 0, 22, 22);

self.pulseAnimationDuration = 0;

self.delayBetweenPulseCycles = 0;

self.annotationColor = [UIColor colorWithRed:0.000 green:0.478 blue:1.000 alpha:1];

self.outerColor = [UIColor whiteColor];

}

return self;

}

- (void)willMoveToSuperview:(UIView *)newSuperview

{

if (newSuperview)

[self reloadLayers];

}

- (void)reloadLayers

{

[_outerDotLayer removeFromSuperlayer];

_outerDotLayer = nil;

[self.layer addSublayer:self.outerDotLayer];

[_colorDotLayer removeFromSuperlayer];

_colorDotLayer = nil;

[self.layer addSublayer:self.colorDotLayer];

}

- (UIImage*)circleImageWithColor:(UIColor*)color height:(float)height {

UIGraphicsBeginImageContextWithOptions(CGSizeMake(height, height), NO, 0);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

UIBezierPath* fillPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, height, height)];

[color setFill];

[fillPath fill];

UIImage *dotImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

CGColorSpaceRelease(colorSpace);

return dotImage;

}


里面还有 高级动画的实现

另外 自定义的 大头针 


注意继承 BMKAnnotation

//  XYLPinView.h//  XYLBaiDuMap////  Created by 夏玉林 on 16/12/17.//  Copyright © 2016年 夏玉林. All rights reserved.//#import// 引入地图功能所有的头文件#import//该类为标注点的protocol,提供了标注类的基本信息函数@interface XYLPinView : NSObject/*

*  传入经纬度结合体

*/

- (instancetype)initWithCoordinate:(CLLocationCoordinate2D )coordinate;

@property (nonatomic,assign) CLLocationCoordinate2D coordinate;

//标题

@property (nonatomic,copy)NSString *title;

//副标题

@property (nonatomic,copy)NSString *subtitle;

@end



m 文件

//

//  XYLPinView.m

//  XYLBaiDuMap

//

//  Created by 夏玉林 on 16/12/17.

//  Copyright © 2016年 夏玉林. All rights reserved.

//

#import "XYLPinView.h"

@implementation XYLPinView

/*

*  传入经纬度结合体

*/

- (instancetype)initWithCoordinate:(CLLocationCoordinate2D )coordinate{

self = [super init];

if (self) {

self.coordinate = coordinate;

}

return self;

}

- (CLLocationCoordinate2D)coordinate

{

return _coordinate;

}

@end


 然后 是 调用百度SDK的添加覆盖物api 接口


#pragma mark==========地图的代理方法================- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id)annotation{

typeof(self) weakSelf = self;

static NSString *identifier = @"userLocation";

//定位点的显示

if ([annotation isKindOfClass:[XYLPinView class]]) {

static NSString *identifier = @"currentLocation";

XYLFenceMapAnnotationView *locationAnnotationView = (XYLFenceMapAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

if (!locationAnnotationView) {

locationAnnotationView = [[XYLFenceMapAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

locationAnnotationView.canShowCallout = NO;

}

return locationAnnotationView;

}

return nil;

}

 到这里 定位点功能实现了.  还是心跳的,脉冲. 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 现在很多社交、...
    JJO阅读 4,115评论 4 19
  • http://www.cnblogs.com/kenshincui/p/4125570.html 摘要: 现在很多...
    大崔老师阅读 3,271评论 1 2
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,094评论 5 13
  • 最近由于公司项目做的是国外的项目,使用到了GoogleMaps SDK ,期间磕磕碰碰各种查资料看官方文档总算完成...
    SHMI阅读 6,704评论 11 14
  • 天堂的花朵折射出她的美好, 一生一世去留下自信的独白。 一个没有人烟和光亮的地方, 你是怎样会去触动初春的暖? 四...
    硕果蕾蕾阅读 209评论 0 3