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的一些小技巧都不是什么很有技术含量东西,或者说很浅显.我说一个技巧,也许很多人都知道,也许也早有人说过.但我想说的是我不是在炫耀什么,我只是想分享一些我 ...
随机推荐
- ifconfig结果说明
- 通过shodan搜索相同favicon.ico的网站
0x01 根据favicon.ico生成hash python2,想改python3折腾了半天不得 import mmh3 import requests response = requests.ge ...
- kali 系列学习12-使用Wifite破解无线网络
一些破解无线网络程序是使用Aircrack-ng工具集,并添加了一个图形界面或使用文本菜单的形式来破解无线网络.这使得用户使用它们更容易,而且不需要记住任何命令.本节将介绍使用命令行工具Wifite, ...
- 其实SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质!
前言 SOL 优化并不简单,做好 SOL 优化需要掌握数据库体系结构.表和索引设计.高效 SOL法.高级 SOL 语法.多种优化工具等知识,甚至还得分析业务特点,以及了解优化器的缺点.只有建立 SOL ...
- 头秃了,使用@AutoConfigureBefore指定配置类顺序竟没生效?
持续原创输出,点击上方蓝字关注我 前言 日常工作中对于Spring Boot 提供的一些启动器可能已经足够使用了,但是不可避免的需要自定义启动器,比如整合一个陌生的组件,也想要达到开箱即用的效果. 在 ...
- 「CSP-S 2020」动物园
description luogu loj(暂无数据) solution 这道题作为T2,对选手们考试开始后先通看一遍所有题目的好习惯,以及判断究竟谁才是真正的签到题的重要能力进行了较好的锻炼, 特别 ...
- Jenkins中如何自定义构造结果
jenkis中的触发邮件机制是根据构建成功与否来发邮件,实际上我们在jenkis上定时执行脚本时是需要根据用例的执行结果来触发邮件预警 本文讲叙如何根据用例的执行结果来触发邮件预警 1.在任务配置的b ...
- CollectionUtils和StringUtils
1.StringUtils(常用-用来操作String的字符串)1.1 判断某字符串是否为空isEmpty StringUtils.isEmpty(null) = true StringUtils.i ...
- [Docker]Docker与Linux ip_forward数据包转发
背景 今天在一台新虚拟机上需要临时启动一个consul服务,安装Docker后使用docker启动,但是在执行启动命令后发现docker有一个警告: WARNING: IPv4 forwarding ...
- 交换机Access、Trunk和Hybrid 接口类型及区别
交换机接口的类型可以是 Access.Trunk和Hybrid. Access类型的接口仅属于一个VLAN,只能接收.转发相应VLAN的帧: Trunk类型接口则默认属于所有VLAN,任何 Tagge ...