iOS开发--百度地图定位与搜索(附带右滑手势冲突解决方法)
2018-05-07 本文已影响108人
CoderW
一. 百度地图
项目中使用到了地图的展示, 定位, 大头针, 搜索功能. 比较简单, 只是一个小模块, 直接上代码.
1. 根据自己的需求配置plist文件(根据自己的情况酌情处理)
1.png2. 导入头文件(我是在pch中引入的)
// 地图
#import <BaiduMapKit/BaiduMapAPI_Map/BMKMapView.h>
// 定位
#import <BaiduMapAPI_Location/BMKLocationService.h>
AppDelegate中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
// 要使用百度地图,请先启动BaiduMapManager
_mapManager = [[BMKMapManager alloc]init];
// 如果要关注网络及授权验证事件,请设定generalDelegate参数
BOOL ret = [_mapManager start:@"你创建百度地图项目时获得的key" generalDelegate:nil];
if (!ret) {
NSLog(@"manager start failed!");
}
}
控制器中(VC)
// 大头针
#import <BaiduMapAPI_Map/BMKPointAnnotation.h>
// 搜索
#import <BaiduMapAPI_Search/BMKPoiSearch.h>
- (void)configUI
{
_mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, DEVICE_SCREEN_WIDTH, DEVICE_SCREEN_HEIGHT - DEVICE_NAVIGATION_BAR_HEIGHT - DEVICE_STATUS_BAR_HEIGHT)];
//以下_mapView为BMKMapView对象
[self.view addSubview:_mapView];
//显示定位图层
_mapView.showsUserLocation = YES;
//设置定位的状态为跟随定位模式
_mapView.userTrackingMode = BMKUserTrackingModeHeading;
_mapView.zoomLevel = 17;
//初始化BMKLocationService
_locService = [[BMKLocationService alloc]init];
_locService.delegate = self;
//启动LocationService
[_locService startUserLocationService];
}
处理位置坐标更新
//处理位置坐标更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
// 设置地图中心点为当前定位位置
_mapView.centerCoordinate = userLocation.location.coordinate;
_annotation = [[BMKPointAnnotation alloc]init];
// 设置大头针位置为当前定位位置
_annotation.coordinate = userLocation.location.coordinate;
[_mapView addAnnotation:_annotation];
// 纬度
_strlatitude = userLocation.location.coordinate.latitude;
// 经度
_strlongitude = userLocation.location.coordinate.longitude;
__weak typeof(self) weakSelf = self;
//旧址
CLLocation *currentLocation = userLocation.location;
CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
//反地理编码
[geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count > 0) {
CLPlacemark *placeMark = placemarks[0];
if (!placeMark.locality) {
[HSAppTool showToastWithText:@"无法定位当前城市"];
}
weakSelf.currentCity = placeMark.locality;
/*看需求定义一个全局变量来接收赋值*/
NSLog(@"----%@",placeMark.country);//当前国家
NSLog(@"%@",placeMark.locality);//当前的城市
NSLog(@"%@",placeMark.subLocality);//当前的位置
NSLog(@"%@",placeMark.thoroughfare);//当前街道
NSLog(@"%@",placeMark.name);//具体地址
}
}];
// 停止(实时定位不用停止, 因为我的需求只要定位一次)
[_locService stopUserLocationService];
}
搜索功能
// textField点击方法(这里我用的是EditingChanged)
- (void)editingSearchTextField:(UITextField *)textField
{
//初始化搜索对象 ,并设置代理
_searcher =[[BMKPoiSearch alloc]init];
_searcher.delegate = self;
//请求参数类BMKCitySearchOption
BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc]init];
citySearchOption.pageCapacity = 10;
// 当前城市
citySearchOption.city = _currentCity;
// 搜索的内容
citySearchOption.keyword = textField.text;
//发起城市内POI检索
BOOL flag = [_searcher poiSearchInCity:citySearchOption];
if(flag) {
[UIView animateWithDuration:0.3 animations:^{
self->_tableView.height = DEVICE_SCREEN_HEIGHT - DEVICE_NAVIGATION_BAR_HEIGHT - DEVICE_TAB_BAR_HEIGHT - 50;
}];
}
else {
NSLog(@"城市内检索发送失败");
}
}
处理搜索结果
//实现PoiSearchDeleage处理回调结果
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error
{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
[_addressListArray removeAllObjects];
NSLog(@"%@", poiResultList);
[_addressListArray addObjectsFromArray:poiResultList.poiInfoList];
[_tableView reloadData];
}
else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
NSLog(@"起始点有歧义");
}
else {
NSLog(@"抱歉,未找到结果");
}
}
更新: 解决右滑返回手势与地图滑动手势冲突
// 关闭右滑返回
id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
pan.cancelsTouchesInView = NO;
pan.delaysTouchesEnded = NO;
[self.view addGestureRecognizer:pan];
觉得有帮助的小伙伴, 可以动动勤劳的小手点个喜欢或者关注哦~
你们的肯定对我很重要!