IOS实现自动定位和手动选择城市功能
IOS自动定位使用的是高德地图SDK
在高德开放平台http://lbs.amap.com/api/ios-sdk/down/ 下载2D地图SDK和搜索SDK
将SDK导入工程内 按照高德的配置说明进行配置项目
最后需要提醒 在高德的SDK中有些文件夹使用的是快捷方式, 如果你在你本地的工程编译通过, 但可能在你的服务端自动打包的时候不能自动编译通过
需要将那些快捷方式的文件夹用真实文件夹替换掉就可以了。
在工程中导入
#import "MAMapKit/MAMapKit.h"
#import "AMapSearchKit/AMapCommonObj.h"
#import "AMapSearchKit/AMapSearchAPI.h"
在Controller中使用初始化地图服务
#pragma mark MAMAP init AND 定位回调
- (void)initMap
{ if (![CLLocationManager locationServicesEnabled]) {
[PXAlertView showAlertWithTitle:@"提示" message:[NSString stringWithFormat:@"请开启定位:设置 > 隐私 > 位置 > 定位服务"] completion:^(BOOL cancelled, NSInteger buttonIndex) {
}];
return;
}
else if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){
[PXAlertView showAlertWithTitle:@"提示" message:[NSString stringWithFormat:@"定位失败,请开启定位:设置 > 隐私 > 位置 > 定位服务 下 应用"] completion:^(BOOL cancelled, NSInteger buttonIndex) {
}];
return;
}
[MAMapServices sharedServices].apiKey = MAMAP_APPKEY;//高德KEY
_mapView = [[MAMapView alloc] init];
_mapView.delegate = self;
_mapView.showsUserLocation = YES;
//[_mapView setUserTrackingMode:MAUserTrackingModeFollowWithHeading animated:YES]; point = [[AMapGeoPoint alloc] init];
_search = [[AMapSearchAPI alloc] initWithSearchKey:MAMAP_APPKEY
Delegate:self];
regeoRequest = [[AMapReGeocodeSearchRequest alloc] init];
regeoRequest.searchType = AMapSearchType_ReGeocode;
regeoRequest.radius = 50;
regeoRequest.requireExtension = YES;
} // 定位回调
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
if (updatingLocation) { point.latitude = userLocation.coordinate.latitude;
point.longitude = userLocation.coordinate.longitude; regeoRequest.location = [AMapGeoPoint locationWithLatitude:point.latitude
longitude:point.longitude];
// 发起逆地理编码
[_search AMapReGoecodeSearch:regeoRequest];
_mapView.showsUserLocation =NO; }
}
// 逆地理编码回调
- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
{
if (response.regeocode != nil) { NSString *province=response.regeocode.addressComponent.province;
NSString *city=response.regeocode.addressComponent.city;
NSString *district=response.regeocode.addressComponent.district;
NSString *value=nil;
NSString *key=nil; NSMutableArray *cityArrayTemp=nil;
for (AreaModel *model in provinceArray) {
if ([model.value isEqualToString:province]) {
cityArrayTemp=[NSMutableArray arrayWithArray:model.children];
}
}
NSMutableArray *districtArryTemp=nil;
if (cityArrayTemp) {
if (city.length>0) {
for (AreaModel *cityModel in cityArrayTemp) {
if ([cityModel.value isEqualToString:city]) {
districtArryTemp=[NSMutableArray arrayWithArray:cityModel.children];
}
}
}
else{
//直辖市
for (AreaModel *cityModel in cityArrayTemp) {
if ([cityModel.value isEqualToString:district]) {
value=cityModel.value;
key=cityModel.key;
}
}
}
}
if (districtArryTemp) {
for (AreaModel *provinceModel in districtArryTemp) {
if ([provinceModel.value isEqualToString:district]) {
value=provinceModel.value;
key=provinceModel.key;
}
}
}
self.keyCode=key;
[self.checkCityButton setTitle:[NSString stringWithFormat:@"%@%@%@",province,city,district] forState:UIControlStateNormal]; }
}
封装省市县 三级选择控件
#import <UIKit/UIKit.h> @interface AreaPickerCheckView : UIView<UIPickerViewDataSource,UIPickerViewDelegate> - (instancetype)initWithFrame:(CGRect)frame andDataSource:(NSArray *)dataSource dismissCompletion:(void (^)(BOOL isCancelClick , NSString *area , NSString *code))completion; @end #import "AreaPickerCheckView.h"
#import "AreaModel.h" @interface AreaPickerCheckView()
{
NSArray *provinceArray;
NSArray *cityArray;
NSArray *areaArray;
void (^completionBlock)(BOOL isCancelClick , NSString *area , NSString *code);
} @property(nonatomic,strong)NSArray *dataSource;
@property(nonatomic,strong)UIPickerView *pickerView; @end @implementation AreaPickerCheckView - (instancetype)initWithFrame:(CGRect)frame andDataSource:(NSArray *)dataSource dismissCompletion:(void (^)(BOOL, NSString *, NSString *))completion
{
self = [super initWithFrame:frame];
if (self) {
completionBlock = [completion copy];
self.dataSource = dataSource;
[self createUI];// Initialization code
}
return self;
} - (void)createUI { provinceArray = self.dataSource; AreaModel *model = [self.dataSource firstObject]; cityArray = model.children; AreaModel *model1 = [model.children firstObject]; areaArray = model1.children; self.pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 25, self.frame.size.width, self.frame.size.height-25)];
self.pickerView.dataSource = self;
self.pickerView.delegate = self;
[self addSubview:self.pickerView]; UIButton *confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
confirmBtn.frame = CGRectMake(Main_Screen_Width - 50, 5, 40, 20);
[confirmBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[confirmBtn setTitle:@"确定" forState:UIControlStateNormal];
[confirmBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
confirmBtn.tag = 100;
[self addSubview:confirmBtn]; UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
cancelBtn.frame = CGRectMake(10, 5, 40, 20);
cancelBtn.tag = 101;
[cancelBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
[cancelBtn setTitle:@"取消" forState:UIControlStateNormal];
[cancelBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self addSubview:cancelBtn]; } #pragma mark dataSouce
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 3;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (component == 0) {
return provinceArray.count;
}else if (component == 1) {
return cityArray.count;
}
return areaArray.count;
}
#pragma mark delegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
AreaModel *model = nil;
if (component == 0) {
model = provinceArray[row];
}else if (component == 1) {
model = cityArray[row];
}else if (component == 2) {
model = areaArray[row];
}
return model.value;
} - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
if (component == 0) {
AreaModel *model = provinceArray[row];
cityArray = model.children;
areaArray = [[cityArray firstObject] children]; [self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2]; }else if (component == 1) {
AreaModel *model = cityArray[row];
areaArray = model.children;
[self.pickerView reloadComponent:2];
}
} - (void)btnClick:(UIButton *)btn {
BOOL isCancel = NO;
switch (btn.tag) {
case 100: break;
case 101:
isCancel = YES;
completionBlock(YES,nil,nil);
return;
break; default:
break;
} NSString *str = nil;
NSString *codeStr = nil; AreaModel *model = provinceArray[[self.pickerView selectedRowInComponent:0]];
str = model.value;
AreaModel *model1 = cityArray[[self.pickerView selectedRowInComponent:1]];
str = [str stringByAppendingString:model1.value];
codeStr = model1.key;
if (areaArray.count > 0) {
AreaModel *model2 = areaArray[[self.pickerView selectedRowInComponent:2]];
str = [str stringByAppendingString:model2.value];
codeStr = model2.key;
} completionBlock(isCancel,str,codeStr);
} @end
在Controller中使用地理位置选择控件
@interface CityCheckController ()<CLLocationManagerDelegate,MAMapViewDelegate,AMapSearchDelegate>
{
NSString *_sessionKey;
NSString *_code;
AMapGeoPoint *point;
AMapReGeocodeSearchRequest *regeoRequest;
NSArray *provinceArray;
}
@property (weak, nonatomic) IBOutlet UITextField *areaTF;
@property(nonatomic,strong) MAMapView *mapView;
@property(nonatomic,strong) AMapSearchAPI *search;
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *models = [AreaModel objectArrayWithFilename:@"area.plist"];
provinceArray=models;
AreaPickerCheckView *picker = [[AreaPickerCheckView alloc]initWithFrame:CGRectMake(0, 0, Main_Screen_Width, 216) andDataSource:models dismissCompletion:^(BOOL isCancelClick, NSString *area, NSString *code) {
[self.areaTF resignFirstResponder];
if (isCancelClick) {
return;
}else{
self.areaTF.text = area;
_code = code;
}
}];
self.areaTF.inputView = picker;
[self initMap];
}
IOS开发技术交流QQ群:491355147 欢迎加入一起讨论技术哦
IOS实现自动定位和手动选择城市功能的更多相关文章
- JS中调用android和ios系统手机打开相机并可选择相册功能
编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/57626154 实现android手机打开相机选择相册 ...
- android EditText长按屏蔽ActionMode context菜单但保留选择工具功能
最近项目要求屏蔽EditText 长按出来的ActionMode菜单,但是要保留选择文本功能.这个屏蔽百度会出现各种方法,这里说一下我的思路: 1.屏蔽百度可知setCustomSelectionAc ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- iOS 8 中如何集成 Touch ID 功能
2013年9月,苹果为当时发布的最新iPhone产品配备了一系列硬件升级方案.在iPhone 5s当中,最具创新特性的机制无疑要数围绕Home按钮设计的超薄金属圈,也就是被称为Touch ID的指纹传 ...
- iOS AudioSession详解 Category选择 听筒扬声器切换
在你读这篇文章之前,如果你不嫌读英文太累,推荐阅读下苹果iOS Human Interface Guidelines中Sound这一章. 选择一个Category AVAudioSessionCa ...
- h5手机端下拉选择城市
<!doctype html><html> <head> <meta http-equiv="Content-Type& ...
- 美团HD(5)-选择城市
DJSelectCityViewController.m #import "DJSelectCityViewController.h" #import "DJConsta ...
- jquery实现输入框聚焦,键盘上下键选择城市
在最近有个项目中 需要实现当文本框聚焦的时候,可以键盘上下键选择内容,按enter键的时候,把内容传到输入框中,如图所示: 实现代码如下: /** *输入框聚焦,键盘上下键选择城市 */ ;(func ...
- 【实用技巧】取消Win7开机账户的手动选择
因为前面碰到的一些事情,稍有感慨. 关于win7的一些小技巧都不是什么很有技术含量东西,或者说很浅显.我说一个技巧,也许很多人都知道,也许也早有人说过.但我想说的是我不是在炫耀什么,我只是想分享一些我 ...
随机推荐
- Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Axios前后端分离模式下无感刷新实现JWT续期
一. 前言 记得上一篇Spring Cloud的文章关于如何使JWT失效进行了理论结合代码实践的说明,想当然的以为那篇会是基于Spring Cloud统一认证架构系列的最终篇.但关于JWT另外还有一个 ...
- webug第四关:告诉你了flang是5位数
第四关:告诉你了flang是5位数 开始看到有点懵 于是不要脸的看源码 burp跑弱口令
- Redis 基础数据结构之二 list(列表)
Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下list(列表)这种数据结构, ...
- 精尽MyBatis源码分析 - MyBatis-Spring 源码分析
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 聊聊ReentrantLock实现原理
ReentrantLock 是常用的锁,相对于Synchronized ,lock锁更人性化,阅读性更强 从LOCK切入 考虑下面的场景如果有A,B线程,同时去执行lock.lock(Lock loc ...
- 走进flex布局
简介:flex 是一个CSS的display 属性中新添加一个值. 随着inline-flex的使用,它将使它适用的元素成为一个flex container(伸缩容器),而这个元素的每个子元素将成为 ...
- spring与分布式事务
转载:https://www.cnblogs.com/qianjun2017/p/8349829.html 转载:https://blog.csdn.net/jaryle/article/detail ...
- CentOS下搭建文件共享服务
nfs部署以及优化 Server端配置 安装rpm服务包 yum install -y nfs-utils 创建数据挂载点 mkdir -p /data 编辑exports文件 vi /etc/exp ...
- Beta冲刺——用户测试报告
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 用户测试报告 用户 ...
- Vue3教程:Vue 3.x 快在哪里?
人云亦云,并不会让你变得有多优秀,而会让你越来越随大流. 当你和别的开发在聊到 Vue 3.0 版本发布,有哪些亮点时,你的答案之一肯定有"它变得更快了,性能上快了 1.2 - 2倍&quo ...