美文网首页iOS开发日记
iOS开发--百度地图定位与搜索(附带右滑手势冲突解决方法)

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

作者: CoderW | 来源:发表于2018-05-07 17:10 被阅读108次

    一. 百度地图

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

    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];
    

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/evdvrftx.html