iOS开发日记

iOS开发--百度地图定位与搜索(附带右滑手势冲突解决方法)

2018-05-07  本文已影响108人  CoderW

一. 百度地图

项目中使用到了地图的展示, 定位, 大头针, 搜索功能. 比较简单, 只是一个小模块, 直接上代码.

1. 根据自己的需求配置plist文件(根据自己的情况酌情处理)
1.png
2. 导入头文件(我是在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];

觉得有帮助的小伙伴, 可以动动勤劳的小手点个喜欢或者关注哦~
你们的肯定对我很重要!

上一篇下一篇

猜你喜欢

热点阅读