iOS实现百度地图拖拽后更新位置以及反编码

前言

最近在开发中遇到了百度地图的开发,功能类似于微信中的发送位置,拖拽从新定位,以及反编码,列表附近的位置。分析出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

效果图:

百度地图拖拽更新位置.gif

实现思路

思路就是将一个UIImageView固定在地图中间,每次更新位置,给UIImageView添加动画即可。

代码如下:

#import "FTBasicController.h"
typedef void (^SelectBlock) (NSString *address,CLLocationCoordinate2D select);
@interface FTUploadAddressController : FTBasicController
@property(nonatomic, copy)SelectBlock selectBlock;
@end
#import "FTUploadAddressController.h"
#import "FTBMKPoiInfo.h"
#import "FTPoiCell.h"
@interface FTUploadAddressController ()@property(nonatomic,strong)BMKLocationService *locService;
@property(nonatomic,strong)BMKUserLocation *userLocation;
@property(nonatomic,strong)BMKMapView *mapView;
@property(nonatomic,strong)UITableView *tableview;
@property(nonatomic,strong)BMKGeoCodeSearch *geocodesearch;
@property(nonatomic,strong)UIImageView *loactionView;
@property(nonatomic,strong)NSMutableArray *dataA;
@property(nonatomic,strong)LxButton *poiBackBtn;
@property(nonatomic,assign)CLLocationCoordinate2D selectedCoordinate;
@property(nonatomic,strong)NSString *selectAddress;
@end
@implementation FTUploadAddressController
-(void)viewWillAppear:(BOOL)animated{
 [super viewWillAppear:animated];
 self.fd_interactivePopDisabled = YES;
 if (!([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) &&[CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined){
  [self judgeOpenlocation];
 }else{
  [_mapView viewWillAppear];
  _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
  _locService.delegate = self;
   _geocodesearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
  _mapView.showsUserLocation = NO;//先关闭显示的定位图层
  _mapView.userTrackingMode = 0;
  _mapView.showsUserLocation = YES;//显示定位图层
  [self.locService startUserLocationService];
 }
}
-(void)judgeOpenlocation{
 UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"打开[定位服务]来允许[应用名字]确定您的位置" message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>应用名字>始终)" preferredStyle:UIAlertControllerStyleAlert];
 [alertVC addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
 [alertVC addAction:[UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.000000) {
   //跳转到定位权限页面
   NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
   if( [[UIApplication sharedApplication]canOpenURL:url] ) {
    [[UIApplication sharedApplication] openURL:url];
   }
  }else {
   //跳转到定位开关界面
   NSURL *url = [NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];
   if( [[UIApplication sharedApplication]canOpenURL:url] ) {
    [[UIApplication sharedApplication] openURL:url];
   }
  }
 }]];
 [self presentViewController:alertVC animated:YES completion:nil];
}
-(void)viewWillDisappear:(BOOL)animated
{
  self.fd_interactivePopDisabled = NO;
 [_mapView viewWillDisappear];
 _mapView.delegate = nil; // 不用时,置nil
 [self.locService stopUserLocationService];
  _geocodesearch.delegate = nil; // 不用时,置nil
 _locService.delegate = nil;
}
- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view.
 self.title = @"所在位置";
  self.locService = [[BMKLocationService alloc]init];
 self.geocodesearch = [[BMKGeoCodeSearch alloc]init];
  [self setup];
  self.navigationItem.leftBarButtonItem =[[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"return"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(backReturn)];
}
-(void)backReturn{
 if (self.selectBlock) {
  self.selectBlock(self.selectAddress, self.selectedCoordinate);
  [self.navigationController popViewControllerAnimated:YES];
 }
}
-(void)setup{
  [self.view addSubview:self.mapView];
 [self.view addSubview:self.tableview];
 [self.mapView addSubview:self.loactionView];
 [self.mapView addSubview:self.poiBackBtn];
  [self.poiBackBtn LX_SetShadowPathWith:[UIColor grayColor] shadowOpacity:0.5 shadowRadius:5 shadowSide:LXShadowPathBottom shadowPathWidth:3];
 FTWS(weakSelf);
 [self.poiBackBtn addClickBlock:^(UIButton *button) {
   [weakSelf.mapView setCenterCoordinate:weakSelf.userLocation.location.coordinate];
 }];
}
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
 //  NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
 [_mapView updateLocationData:userLocation];
 self.userLocation = userLocation;
 [self.mapView setCenterCoordinate:userLocation.location.coordinate];
 BMKReverseGeoCodeOption * option = [[BMKReverseGeoCodeOption alloc]init];
 option.reverseGeoPoint = userLocation.location.coordinate;
 BOOL flag = [_geocodesearch reverseGeoCode:option];
 if (flag) {
 }
 //更新位置之后必须停止定位,
 [_locService stopUserLocationService];
}
-(void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
 NSLog(@"地图拖动");
 [UIView animateWithDuration:0.30 animations:^{
  self.loactionView.centerY -=8;
 } completion:^(BOOL finished) {
  self.loactionView.centerY +=8;
 }];
 CGPoint touchPoint = self.mapView.center;
 CLLocationCoordinate2D touchMapCoordinate =
 [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];//这里touchMapCoordinate就是该点的经纬度了
 NSLog(@"touching %f,%f",touchMapCoordinate.latitude,touchMapCoordinate.longitude);
 //选择的上传地址
 self.selectedCoordinate = touchMapCoordinate;
 BMKReverseGeoCodeOption * option = [[BMKReverseGeoCodeOption alloc]init];
 option.reverseGeoPoint = touchMapCoordinate;
 BOOL flag = [_geocodesearch reverseGeoCode:option];
 if (flag) {
 }
}
#pragma mark---获取反编码的数据---
-(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
  BMKAddressComponent *component=[[BMKAddressComponent alloc]init];
  component=result.addressDetail;
 [self.dataA removeAllObjects];
 for (int i =0; i< result.poiList.count; i++) {
  BMKPoiInfo *info = result.poiList[i];
  FTBMKPoiInfo *ftInfo =[[FTBMKPoiInfo alloc]init];
  ftInfo.address = info.address;
  ftInfo.seleced = NO;
  if (i == 0) {
   ftInfo.seleced = YES;
   self.selectAddress = ftInfo.address;
  }
  [self.dataA addObject:ftInfo];
 }
 [self.tableview reloadData];
}
#pragma mark--- 定位的方法--
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
 [_mapView updateLocationData:userLocation];
 // NSLog(@"heading is %@",userLocation.heading);
}
-(BMKMapView *)mapView{
 if (!_mapView) {
  _mapView =[[BMKMapView alloc]initWithFrame:CGRectMake(0, NAVH, Device_Width, 350)];
  _mapView.zoomLevel = 18;
  _mapView.minZoomLevel = 3;
  _mapView.maxZoomLevel = 21;
//  BMKLocationViewDisplayParam *displayParam = [[BMKLocationViewDisplayParam alloc]init];
//  displayParam.isRotateAngleValid = true;//跟随态旋转角度是否生效
//  displayParam.isAccuracyCircleShow = false;//精度圈是否显示
//  displayParam.locationViewOffsetX = 0;//定位偏移量(经度)
//  displayParam.locationViewOffsetY = 0;//定位偏移量(纬度)
//  [_mapView updateLocationViewWithParam:displayParam];
 }
 return _mapView;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
 return self.dataA.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 FTPoiCell *cell =[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
 if (!cell) {
  cell =[[FTPoiCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
 }
 FTBMKPoiInfo *info = self.dataA[indexPath.row];
 cell.info = info;
 return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
 FTBMKPoiInfo *info = self.dataA[indexPath.row];
 self.selectAddress = info.address;
 [self.dataA enumerateObjectsUsingBlock:^(FTBMKPoiInfo * obj, NSUInteger idx, BOOL * _Nonnull stop) {
  if (obj == info) {
   obj.seleced = YES;
  }else{
   obj.seleced = NO;
  }
  [self.tableview reloadData];
 }];
 if (self.selectBlock) {
  self.selectBlock(self.selectAddress,self.selectedCoordinate);
  [self.navigationController popViewControllerAnimated:YES];
 }
}
-(UITableView *)tableview{
 if (!_tableview) {
  _tableview =[[UITableView alloc]initWithFrame:CGRectMake(0, self.mapView.bottom, Device_Width, Device_Height - self.mapView.bottom) style:UITableViewStylePlain];
  _tableview.delegate = self;
  _tableview.dataSource = self;
  _tableview.showsVerticalScrollIndicator = NO;
  _tableview.showsHorizontalScrollIndicator = NO;
  _tableview.tableFooterView = [UIView new];
  _tableview.rowHeight = 44;
  [_tableview registerNib:[UINib nibWithNibName:@"FTPoiCell" bundle:nil] forCellReuseIdentifier:@"cell"];
//  [_tableview registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
 }
 return _tableview;
}
-(NSMutableArray *)dataA{
 if (!_dataA) {
  _dataA =[NSMutableArray array];
 }
 return _dataA;
}
-(UIImageView *)loactionView{
 if (!_loactionView) {
  _loactionView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"ditu_red"]];
  _loactionView.center = CGPointMake(self.mapView.width/2, self.mapView.height/2);
 }
 return _loactionView;
}
-(LxButton *)poiBackBtn{
 if (!_poiBackBtn) {
  _poiBackBtn =[LxButton LXButtonWithTitle:nil titleFont:nil Image:nil backgroundImage:nil backgroundColor:[UIColor whiteColor] titleColor:nil frame:CGRectMake(Device_Width - 75, self.mapView.height - 75, 50, 50)];
  [_poiBackBtn setFTCornerdious:25];
  UIImageView *imageView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"poi_back"]];
  imageView.center = CGPointMake(25, 25);
  [_poiBackBtn addSubview:imageView];
 }
 return _poiBackBtn;
}
@end

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • IOS百度地图导航开发功能实现简述

    以下通过图文并茂的方式给大家讲述百度地图导航开发功能: 第一步:在使用百度导航之前,我们需要在百度地图开放平台上下载导航的 SDK,共85.8M,网速不好的同学可提前准备好. 第二步:引入导航所需的系统包 将AudioToolbox.framework.ImageIO.framework.CoreMotion.framework.CoreLocation.framework.CoreTelephony.framework.MediaPlayer.framework.AVFoundation.fr

  • ios百度地图的使用(普通定位、反地理编码)

    iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下: #import <CoreLocation/CoreLocation.h> 使用到的头文件 要引入CoreLocation这个包 <CLLocationManagerDelegate> 使用的代理名称 //1.使用定位服务 //设置app有访问定位服务的权限 //在使用应用期间 / 始终(app在后台) //info.plist文件添加以下两条(或者其中一条): //NSLoc

  • IOS实现百度地图自定义大头针和气泡样式

    一.自定义大头针和气泡 // 根据anntation生成对应的View - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation { NSString *AnnotationViewID = [NSString stringWithFormat:@"renameMark%d",i]; newAnnotation = [[BMKPi

  • iOS百度地图简单使用详解

    百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰富的LBS能力 . 今天主要介绍以下接口 基础地图 POI检索 定位 首先配置环境 1.自动配置.framework形式开发包(使用CocoaPods)<推荐> 2.手动配置.framework形式开发包 特别注意: (API里有很多注意点,大家可以具体去看.但是我说的后两点少其中一个都会失败,第一点是有需求的话,必须加上)

  • iOS实现百度地图拖拽后更新位置以及反编码

    前言 最近在开发中遇到了百度地图的开发,功能类似于微信中的发送位置,拖拽从新定位,以及反编码,列表附近的位置.分析出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 效果图: 百度地图拖拽更新位置.gif 实现思路 思路就是将一个UIImageView固定在地图中间,每次更新位置,给UIImageView添加动画即可. 代码如下: #import "FTBasicController.h" typedef void (^SelectBlock) (NSString *addr

  • jquery ui sortable拖拽后保存位置

    jqueryUI sortable 可以用来进行页面拖拽布局,然而有一个小问题就是拖拽后如何保存状态. 工作中遇到了这个情况,遍把这个问题记了下来,具体思路是: 利用拖拽stop后利用 var arr = $( ".sortable" ).sortable('toArray'); 记录拖拽后的id数组顺序,然后把这个数组存起来,可以存cookie,数据库,localstorage等,刷新页面后读取这个数组,然后进行重新排序. 具体的代码如下可直接复制运行.本文将数组保存在localst

  • 百度地图API之百度地图退拽标记点获取经纬度的实现代码

    本文给大家分享百度地图api之百度地图退拽标记点获取经纬度的实现方法,具体代码如下所示: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0

  • IOS Xib控件拖拽与页面跳转实例

    之前一直都是用代码写UI,Xib使用比较少,今天做个简单的总结,也算重新学习下. 如下图一,右上角的红色圈圈,用来分屏用的,可以切换成2个屏幕,一个展示Xib的UI,一个展示代码,如下所示.主要为了控件与代码之间的连线用. 1. 给UIlabel ,UItextField 等控件关联IBOutlet 选中一个控件然后右键,然后出现一个黑色的框(如图2,红色圈起来的),然后选中Referencing Outlets ,按住ctrl建,拖到代码区域,就可以生成 @property (strong,n

  • Android使用RecycleView实现拖拽交换item位置

    本文实例为大家分享了RecycleView实现拖拽交换item位置的具体代码,供大家参考,具体内容如下 老规矩,先来一张效果图: 相比起ListView而言,RecycleView实现拖拽交换位置的效果要简单很多,因为通过SDK中的ItemTouchHelper工具类可以轻松的实现这种效果,并且一套代码支持所有布局方式;而ListView的话则需要通过生成View的缓存镜像设置到ImageView中,然后通过WindowManager来操作该ImageView,具体怎么实现这里就不展开讲解了.回

  • iOS使用UICollectionView实现拖拽移动单元格

    本文实例为大家分享了iOS开发UICollectionView拖拽移动单元格的具体代码,供大家参考,具体内容如下 一.介绍 iOS9提供API实现单元格排序呢功能,使用UICollectionView及其代理方法.iOS9之后有自带方法可以实现该效果,只需添加长按手势,实现手势方法和调用iOS9的API交换数据,iOS9之前需要自己写方法实现这效果,除了要添加长按手势,这里还需要利用截图替换原理,手动计算移动位置来处理视图交换和数据交换. 二.方法和步骤 1.创建工程项目和视图控制器,如下图 2

  • iOS实现百度地图定位签到功能

    写在前面: 项目需求用到这个功能,主要目的是实现老师设置位置签到范围,学生在一定范围内进行签到的功能. 功能如下方截图: 屏幕快照 2019-01-28 上午10.29.26.png 简要介绍: 下面记录一下主要的实现流程,功能的实现主要是根据百度地图开发者官网提供的api文档,各项功能之间组合.百度地图的SDK现在分成了地图功能和定位功能两块不同的SDK,BaiduMapAPI这个是基础的地图功能,BMKLocationKit这个是定位功能.项目里实现定位签到功能用的的SDK包括上面说的这两个

  • iOS实现UIButton的拖拽功能

    本文实例为大家分享了iOS实现UIButton拖拽功能的具体代码,供大家参考,具体内容如下 在APP界面中,把资讯等功能设置为悬浮的Button并且能够让用户自己拖拽调整位置很常用.这里实现一下上述的功能,我们先看一下效果图 这里给UIButton的拖拽的范围进行了设定,超过了这个区域则强行结束拖拽. 我们知道UIButton是自带手势事件的,但我们不选择使其自带的手势事件来响应拖拽,其原因为自带的手势不好得到和控制拖拽的状态.我们创建一个 UIPanGestureRecognizer 添加给U

随机推荐