本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java
, 数据结构与算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 联系微信tsaievan
.
昨天实现了加载地图视图的功能
但是会发现一个问题, 那就是:
控制器既加载地图, 又请求定位, 今后很可能还要规划路径, 自定义大头针等等
很显然, 控制器即将沦为一个 胖控制器, 这是我们不愿意看到的
而且, 有这样一种可能, 在不同的控制器里, 都有可能要调用地图, 那么我们就可以封装一个地图管理类, 将地图相关的内容都封装到这个管理类里, 当我们需要用到地图的时候, 就去找这个管理类, 就像这样
管理类的单例代码
#import "BaiduMapManager.h"
@interface BaiduMapManager ()
@end
@implementation BaiduMapManager
#pragma mark *** 设置一个单例 ***
+ (instancetype)sharedManager
{
static id manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[BaiduMapManager alloc]init];
});
return manager;
}
从上图可以看到, 我还封装了一个管理类的分类, 这样管理类的可延展性就更好了, 需要加模块的时候, 就加一个分类就可以了
我已经把昨天的加载地图的代码封装好了, 今天的重点是定位, 那么, 定位需要几个什么步骤呢?
- info.plist 文件的配置(其实昨天就已经配置好了)
开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
配置好了之后, 系统会在 APP 第一次启动时, 提示用户授权允许定位
- 初始化BMKLocationService(这是开启定位的关键类)
- 初始化
- 开启定位服务
- (BMKLocationService *)locationService
{
if (!_locationService) {
_locationService = [[BMKLocationService alloc]init];
[_locationService startUserLocationService];
}
return _locationService;
}
- 设置locationService的代理
- (void)startLoacation
{
/* 设置代理 */
kBaiduMapManager.locationService.delegate = self;
}
- 完成代理的回调
- 这个代理 API 就是当用户位置发生变化的时候调用
- 将用户位置更新到地图视图上
- 更改地图视图的追踪模式为跟随
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
[kBaiduMapManager.mapView updateLocationData:userLocation];
/* 地图比例尺级别,在手机上当前可使用的级别为3-21级 */
kBaiduMapManager.mapView.zoomLevel = 15;
kBaiduMapManager.mapView.userTrackingMode = BMKUserTrackingModeFollow;
}
- 我将开始定位的方法封装在BaiduMapManager+location.h中, 这样,外界在需要完成地图定位的时候,就只需要 通过地图管理类的单例 调用startLoacation这一个 API 即可
#pragma mark *** 视图的生命周期 ***
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:kBaiduMapManager.mapView];
}
#pragma mark *** 点击定位按钮触发的事件 ***
- (IBAction)locationBarButtonItemClickAction:(UIBarButtonItem *)sender {
[kBaiduMapManager startLoacation];
}