iOS百度地图反编码个人见解
类似于微信中的发送位置拖拽从新定位以及反编码列表附近的位置。
百度地图拖拽更新位置.gif
思路就是将一个UIImageView 固定在地图中间每次更新位置给UIImageView添加劢画即可。
代码如下
#import "FTBasicControl ler.h"typedef void (^SelectBlock) (NSString *address,CLLocationCoordinate2D select);@interface FTUploadAddressControl ler : FTBasicControl ler
@property(nonatomic, copy)SelectBlock selectBlock;
@end
#import "FTUploadAddressControl ler.h"
#import "FTBMKPoiInfo.h"
#import "FTPoiCel l.h"
@interface FTUploadAddressControl ler
()<BMKMapViewDelegate,BMKLocationServiceDelegate,UITableViewDelegate,UITableViewDataSource,BMKGeoCodeSearchDelegate>
@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 FTUploadAddressControl ler
-(void)viewWi l lAppear:(BOOL)animated{
[superviewWi l lAppear:animated];self.fd_interactivePopDisabled =YES;if (!([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusAuthorizedAlways | | [CLLocationManager authorizationStatus] ==
kCLAuthorizationStatusAuthorizedWhenInUse)&&[CLLocationManagerauthorizationStatus] != kCLAuthorizationStatusNotDetermined){
[self judgeOpenlocation] ;
}else{
[_mapView viewWi l lAppear] ;
_mapView.delegate = self; //此处记得丌用的时候需要置ni l 否则影响内存的释放
_locService.delegate = self;
_geocodesearch.delegate= self;//此处记得丌用的时候需要置ni l 否则影响内存的释放
_mapView.showsUserLocation= NO;//先关闭显示的定位图层
_mapView.userTrackingMode = 0;
_mapView.showsUserLocation=YES;//显示定位图层
[self. locService startUserLocationService] ;
}
}
-(void)judgeOpenlocation{
UIAlertControl ler *alertVC= [UIAlertControl ler alertControl lerWithTitle:@"打开[定位服务]来允许[应用名字]确定您的位置"message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>应用名字>始终) "preferredStyle:UIAlertControl lerStyleAlert];
[alertVC addAction:[UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancel handler:ni l] ];
[alertVC addAction:[UIAlertActionactionWithTitle:@"去设置"style:UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnul l action) {if ([ [[UIDevice currentDevice] systemVersion] floatValue] >= 10.000000) {
//跳转到定位权限页面
NSURL *url = [NSURL URLWithString:UIAppl icationOpenSettingsURLString];if( [[UIAppl ication sharedAppl ication]canOpenURL:url] ) {
[[UIAppl ication sharedAppl ication]openURL:url] ;
}
}else{
//跳转到定位开关界面
NSURL *url = [NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];if( [[UIAppl ication sharedAppl ication]canOpenURL:url] ) {
[[UIAppl ication sharedAppl ication]openURL:url] ;
}
}
}] ];
[self presentViewControl ler:alertVC animated:YES completion:ni l];
}
-(void)viewWi l lDisappear:(BOOL)animated
{self.fd_interactivePopDisabled = NO;
[_mapViewviewWi l lDisappear];
_mapView.delegate = ni l; //丌用时置ni l
[self. locService stopUserLocationService];
_geocodesearch.delegate = ni l ;//丌用时置ni l
_locService.delegate = ni l;
}
- (void)viewDid Load{
[superviewDidLoad];
//Doanyadditional setup after loading the view.self.title =@"所在位置";self. locService = [[BMKLocationService al loc] init] ;self.geocodesearch= [ [BMKGeoCodeSearchal loc] init];
[self setup];self.navigationItem. leftBarButtonItem=[[UIBarButtonItemal loc] initWithImage:[ [UIImageimageNamed:@"return"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(backReturn)];}
-(void)backReturn{if (self.selectBlock) {self.selectBlock(self.selectAddress, self.selectedCoordinate);
[self.navigationControl ler popViewControl lerAnimated:YES];
}
}
-(void)setup{
[self.viewaddSubview:self.mapView] ;
[self.viewaddSubview:self.tableview];
[self.mapViewaddSubview:self. loactionView];
[self.mapViewaddSubview:self.poiBackBtn] ;
[self.poiBackBtn LX_SetShadowPathWith:[UIColorgrayColor] shadowOpacity:0.5shadowRadius:5 shadowSide:LXShadowPathBottom shadowPathWidth:3];
FTWS(weakSelf);
[self.poiBackBtnaddCl ickBlock:^(UIButton *button) {
[weakSelf.mapViewsetCenterCoordinate:weakSelf.userLocation. location.coordinate];
}] ;
}
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
// NSLog(@"didUpdateUserLocationlat%f, long%f",userLocation. location.coordinate. latitude,userLocation. location.coordinate. longitude);
[_mapView updateLocationData:userLocation];self.userLocation = userLocation;
[self.mapViewsetCenterCoordinate:userLocation. location.coordinate];
BMKReverseGeoCodeOption *option = [ [BMKReverseGeoCodeOption al loc] init] ;option.reverseGeoPoint= userLocation. location.coordinate;
BOOLflag = [_geocodesearch reverseGeoCode:option];if (flag) {
}
//更新位置之后必须停止定位
[_locService stopUserLocationService];
}
-(void)mapView:(BMKMapView*)mapViewregionDidChangeAnimated:(BOOL)animated{
NSLog(@"地图拖劢");
[UIViewanimateWithDuration:0.30animations:^{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 al loc] init] ;option.reverseGeoPoint= touchMapCoordinate;
BOOLflag = [_geocodesearch reverseGeoCode:option];if (flag) {
}
}
#pragma mark---获取反编码的数据---
-(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcherresult:(BMKReverseGeoCodeResult *)resulterrorCode:(BMKSearchErrorCode)error{
BMKAddressComponent *component=[ [BMKAddressComponental loc]init] ;component=result.addressDetai l;
[self.dataA removeAl lObjects];for (int i =0; i< result.poiList.count; i++) {
BMKPoiInfo*info = result.poiList[i];
FTBMKPoiInfo*ftInfo=[[FTBMKPoiInfo al loc]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=[ [BMKMapViewal loc] initWithFrame:CGRectMake(0,NAVH,Device_Width, 350)] ;
_mapView.zoomLevel = 18;
_mapView.minZoomLevel = 3;
_mapView.maxZoomLevel = 21;
// BMKLocationViewDisplayParam*displayParam=
[ [BMKLocationViewDisplayParam al loc] init] ;
// displayParam. isRotateAngleVal id = true;//跟随态旋转角度是否生效// displayParam. isAccuracyCircleShow= false;//精度圈是否显示// displayParam. locationViewOffsetX= 0;//定位偏移量(经度)
// displayParam. locationViewOffsetY= 0;//定位偏移量纬度
// [_mapView updateLocationViewWithParam:displayParam];
}return_mapView;
}
-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{returnself.dataA.count;
}
-(UITableViewCel l *)tableView:(UITableView*)tableViewcel lForRowAtIndexPath:(NSIndexPath *)indexPath{
FTPoiCel l *cel l =[tableViewdequeueReusableCel lWithIdentifier:@"cel l "forIndexPath: indexPath];if (!cel l) {cel l =[ [FTPoiCel l al loc] initWithStyle:UITableViewCel lStyleDefaultreuseIdentifier:@"cel l "];
}
FTBMKPoiInfo*info = self.dataA[indexPath.row] ;cel l. info= info;returncel l ;
}
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath
*)indexPath{
[tableView deselectRowAtIndexPath: indexPath animated:YES] ;
FTBMKPoiInfo*info = self.dataA[indexPath.row] ;self.selectAddress = info.address;
[self.dataAenumerateObjectsUsingBlock:^(FTBMKPoiInfo*obj,NSUInteger idx,BOOL *_Nonnul l stop) {i f (o bj == info) {obj.seleced =YES;
}else{obj.seleced =NO;
}
[self.tableviewreloadData] ;
}] ;if (self.selectBlock) {self.selectBlock(self.selectAddress,self.selectedCoordinate);
[self.navigationControl ler popViewControl lerAnimated:YES];
}
}
-(UITableView*)tableview{if (!_tableview) {
_tableview=[ [UITableViewal loc]initWithFrame:CGRectMake(0,self.mapView.bottom,Device_Width,Device_Height - self.mapView.bottom)style:UITableViewStylePlain];
_tableview.delegate = self;
_tableview.dataSource = self;
_tableview.showsVerticalScrol lIndicator= NO;
_tableview.showsHorizontalScrol lIndicator= NO;
_tableview.tableFooterView= [UIView new];
_tableview.rowHeight= 44;
[_tableview registerNib: [UINib nibWithNibName:@"FTPoiCel l "bundle:ni l]forCel lReuseIdentifier:@"cel l "] ;
// [_tableview registerClass:[UITableViewCel l class] forCel lReuseIdentifier:@"cel l "];}return_tableview;
}
-(NSMutableArray*)dataA{i f (!_d a ta A) {
_dataA=[NSMutableArrayarray];
}return_dataA;
}
-(UIImageView*)loactionView{if (!_loactionView) {
_loactionView=[[UIImageViewal loc] initWithImage: [UIImageimageNamed:@"ditu_red"]] ;
_loactionView.center = CGPointMake(self.mapView.width/2,self.mapView.height/2);
}return_loactionView;
}
-(LxButton *)poiBackBtn{if (!_poiBackBtn) {
_poiBackBtn =[LxButton LXButtonWithTitle:ni l titleFont:ni l Image:ni lbackgroundImage:ni l backgroundColor:[UIColorwhiteColor] titleColor:ni lframe:CGRectMake(Device_Width - 75, self.mapView.height - 75, 50, 50)];
[_poiBackBtn setFTCornerdious:25] ;
UIImageView*imageView=[[UIImageViewal loc] initWithImage:[UIImageimageNamed:@"poi_back"] ];imageView.center = CGPointMake(25,25);
[_poiBackBtnaddSubview: imageView] ;
}return_poiBackBtn;
}
@end
beervm是一家国人商家,主要提供国内KVM VPS,有河南移动、广州移动等。现在预售湖南长沙联通vds,性价比高。湖南长沙vps(长沙vds),1GB内存/7GB SSD空间/10TB流量/1Gbps端口/独立IP/KVM,350元/月,有需要的可以关注一下。Beervm长沙联通vps套餐:长沙联通1G青春版(预售)长沙联通3G标准版(预售)长沙联通3G(预售)vCPU:1vCPU:2vCPU...
2022年春节假期陆续结束,根据惯例在春节之后各大云服务商会继续开始一年的促销活动。今年二月中旬会开启新春采购季的活动,我们已经看到腾讯云商家在春节期间已经有预告活动。当时已经看到有抢先优惠促销活动,目前我们企业和个人可以领取腾讯云代金券满减活动,以及企业用户可以领取域名优惠低至.COM域名1元。 直达链接 - 腾讯云新春采购活动抢先看活动时间:2022年1月20日至2022年2月15日我们可以在...
LOCVPS发来了新的洛杉矶CN2线路主机上线通知,基于KVM架构,目前可与香港云地、香港邦联机房XEN架构主机一起适用7折优惠码,优惠后最低美国洛杉矶CN2线路KVM架构2GB内存套餐月付38.5元起。LOCPVS是一家成立较早的国人VPS服务商,目前提供洛杉矶MC、洛杉矶C3、和香港邦联、香港沙田电信、香港大埔、日本东京、日本大阪、新加坡、德国和荷兰等机房VPS主机,基于KVM或者XEN架构。...