• 任务:显示地图在界面上并成功定位一:我们导入高德地图的API在Podfileplatform :ios, '7.0' target ‘你的项目名称’ do pod 'AMap3DMap' pod ‘AMapSearch’ pod ‘AMapLocation’ end注意:target中 正确输入...

    任务:显示地图在界面上并成功定位


    一:我们导入高德地图的API

    在Podfile

    platform :ios, '7.0'  
    target ‘你的项目名称’ do  
    pod 'AMap3DMap' 
    pod ‘AMapSearch’
    pod ‘AMapLocation’
    end

    注意:target中 正确输入你自己的项目名称

    cd 进项目文件夹 pod install 成功后进入下一步。

    二:加载地图视图

    在.h文件中

    #import <UIKit/UIKit.h>
    #import <MAMapKit/MAMapKit.h>
    #import <AMapFoundationKit/AMapFoundationKit.h>
    
    
    @interface MainPageVC : UIViewController<MAMapViewDelegate>
    
    @property (nonatomic,strong)MAMapView *mapView;
    
    @end

    在.m文件中

    - (void)ViewDidLoad{
        
        [AMapServices sharedServices].enableHTTPS = YES;
        
        _mapView = [[MAMapView alloc]initWithFrame:CGRectMake(0, self.navigationController.navigationBar.frame.size.height + [[UIApplication sharedApplication]statusBarFrame].size.height, self.view.frame.size.width, self.view.frame.size.height - (self.navigationController.navigationBar.frame.size.height + [[UIApplication sharedApplication]statusBarFrame].size.height))];
        
        //delegate
        [_mapView setDelegate:self];
        
        //是否显示指南针
        [_mapView setShowsCompass:YES];
        
        //是否显示比例尺
        [_mapView setShowsScale:YES];
        
        //地图旋转
        [_mapView setRotateEnabled:NO];
        
        //地图倾斜
        [_mapView setRotateCameraEnabled:NO];
        
        //设置缩放级别
        [_mapView setZoomLevel:15];
        
        //是否显示用户位置
        _mapView.showsUserLocation = YES;
        
        //设置导航模式为跟随
        _mapView.userTrackingMode = MAUserTrackingModeFollow ;
        
        
        [self.view addSubview:_mapView];
    }

    至此,能够正确显示mapView了(不过显示的是北京的或者是你模拟器设置的坐标点的地方地图)


    三:定位

    3.1

    获取key值(从这个网页里获得):点击打开链接

    http://lbs.amap.com/api/ios-location-sdk/guide/create-project/get-key 

    AppDelegate.m 中添加设置key值

    #import <AMapFoundationKit/AMapFoundationKit.h>
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        [AMapServices sharedServices].apiKey = @"987e1c858fb578f98b3c39e9516ecf96";
        
        return YES;
    }

    3.2

    给定位权限:

    在info.plist中添加这三个权限

    Privacy - Location Always and When In Use Usage Description

    Privacy - Location Always Usage Description

    Privacy - Location When In Use Usage Description

    在App Transport Security Settings 中添加Allow Arbitrary Loads 为 YES


    其后设置



    3.3 

    #import <AMapLocationKit/AMapLocationKit.h>
    - (void)location{
        
        if([CLLocationManager locationServicesEnabled]){
        
            AMapLocationManager *locationManager = [[AMapLocationManager alloc]init];
            
            [locationManager setDelegate:self];
            
            //是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。由于iOS系统限制,需要在定位未开始之前或定位停止之后,修改该属性的值才会有效果。
            [locationManager setAllowsBackgroundLocationUpdates:NO];
            
            //指定定位是否会被系统自动暂停。默认为NO。
            [locationManager setPausesLocationUpdatesAutomatically:NO];
            
            //设定定位的最小更新距离。单位米,默认为 kCLDistanceFilterNone,表示只要检测到设备位置发生变化就会更新位置信息
            [locationManager setDistanceFilter:20];
            
            //设定期望的定位精度。单位米,默认为 kCLLocationAccuracyBest
            [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
            
            //开始定位服务
            [locationManager startUpdatingLocation];
            
        }
    }

    相关代码可以看点击打开链接
    展开全文
  • 项目需要实现仿微信朋友圈可定位、搜索附近位置的功能:...pod 'AMapSearch' #地图SDK搜索功能 pod 'AMapLocation' #定位SDK 第2步,引入头文件 #import <AMapFoundationKit/AMapFoundationKit.h> #impor...

    项目需要实现仿微信朋友圈可定位、搜索附近位置的功能:

     

    实现方法

    第1步,集成SDK(这里使用 CocoaPods 安装)

    pod 'AMapSearch' #地图SDK搜索功能
    pod 'AMapLocation' #定位SDK

     

    第2步,引入头文件

    #import <AMapFoundationKit/AMapFoundationKit.h>
    #import <AMapLocationKit/AMapLocationKit.h>
    #import <AMapSearchKit/AMapSearchKit.h>

     

    第3步,配置Key

    在调用定位时,需要添加Key,需要注意的是请在 SDK 任何类的初始化以及方法调用之前设置正确的 Key。

    [AMapServices sharedServices].apiKey = @"b5a84655e2cef54d488e990287d26bb9";

     

    第4步,更改info.plist

    在info.plist的字段添加定位权限的申请,配置方式请参考手动部署部分说明。

     

    第5步,配置后台定位

     

    第6步,代码实现

    #import "SearchSitesController.h"
    
    @interface SearchSitesController () <UITextFieldDelegate,AMapLocationManagerDelegate,AMapSearchDelegate>
    
    @property (nonatomic,strong) UITextField *searchTxt;//搜索框
    
    @property (nonatomic,assign) BOOL isSearchAround;
    
    @property (nonatomic,strong) NSMutableArray *addressArray;//搜索到的地址数组
    
    @property (nonatomic,strong) AMapLocationManager *locationManager;//定位管理
    
    @property (nonatomic,strong) AMapSearchAPI *searchAPI;//搜索类
    
    @property (nonatomic,strong) CLLocation *location;//当前定位的位置
    
    @property (nonatomic,copy) NSString *currentCity;//当前城市
    
    @end
    
    @implementation SearchSitesController
    
    #pragma mark - 懒加载
    
    - (NSMutableArray *)addressArray
    {
        if (!_addressArray) {
            _addressArray = [NSMutableArray array];
        }
        return _addressArray;
    }
    
    - (AMapLocationManager *)locationManager
    {
        if (!_locationManager) {
            _locationManager = [[AMapLocationManager alloc] init];
            [_locationManager setDelegate:self];
            [_locationManager setAllowsBackgroundLocationUpdates:YES];
            //iOS 9(不包含iOS 9) 之前设置允许后台定位参数,保持不会被系统挂起
            [_locationManager setPausesLocationUpdatesAutomatically:NO];
            //iOS 9(包含iOS 9)之后新特性:将允许出现这种场景,同一app中多个locationmanager:一些只能在前台定位,另一些可在后台定位,并可随时禁止其后台定位。
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
                _locationManager.allowsBackgroundLocationUpdates = YES;
            }
        }
        return _locationManager;
    }
    
    - (AMapSearchAPI *)searchAPI
    {
        if (!_searchAPI) {
            _searchAPI = [[AMapSearchAPI alloc] init];
            _searchAPI.delegate = self;
        }
        return _searchAPI;
    }
    
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:nil style:UIBarButtonItemStylePlain target:nil action:nil];
       
        //搜索框
        _searchTxt = [HELPER textFieldWithSuperView:self.view textAlignment:NSTextAlignmentLeft fontSize:14 textColor:TITLE_BLACK backgroundColor:RGB(243, 244, 246) placeholder:@"搜索地点" placeholderColor:PLACEHOLDER_COLOR placeholderFont:14 andMasonryBlock:^(MASConstraintMaker * _Nonnull make) {
            make.left.equalTo(@11);
            make.right.equalTo(@-55);
            make.height.equalTo(@31);
            make.top.equalTo(@(10));
        }];
        _searchTxt.delegate = self;
        _searchTxt.layer.cornerRadius = 31/2;
        _searchTxt.layer.masksToBounds = YES;
        _searchTxt.clearButtonMode = UITextFieldViewModeWhileEditing;
        _searchTxt.leftView = [[UIView alloc]initWithFrame:FRAME(0, 0, 35, 35)];
        _searchTxt.leftViewMode = UITextFieldViewModeAlways;
        [HELPER imageViewWithSuperView:_searchTxt.leftView backgroundColor:COLOR(clearColor) image:IMG(@"icon_search") andMasonryBlock:^(MASConstraintMaker * _Nonnull make) {
            make.center.equalTo(self.searchTxt.leftView);
        }];
        [_searchTxt addTarget:self action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged];
        
        //取消按钮
        [HELPER buttonWithSuperView:self.view andNormalTitle:@"取消" andNormalTextColor:PLACEHOLDER_COLOR andTextFont:16 andNormalImage:nil andCornerRadius:0 backgroundColor:COLOR(clearColor) addTarget:self action:@selector(cancelAction:) forControlEvents:UIControlEventTouchUpInside andMasonryBlock:^(MASConstraintMaker * _Nonnull make) {
            make.centerY.equalTo(self.searchTxt.mas_centerY);
            make.left.equalTo(self.searchTxt.mas_right).offset(5);
            make.right.equalTo(@-5);
        }];
        //分割线
        [HELPER imageViewWithSuperView:self.view backgroundColor:COLOR(groupTableViewBackgroundColor) image:nil andMasonryBlock:^(MASConstraintMaker * _Nonnull make) {
            make.height.equalTo(@1);
            make.left.right.equalTo(@0);
            make.top.equalTo(self.searchTxt.mas_bottom).offset(10);
        }];
        
        //设置tableView
        self.mainTableView = [self tableViewWithSuperView:self.view style:UITableViewStylePlain backgroundColor:COLOR(clearColor) target:self andMasonryBlock:^(MASConstraintMaker * _Nonnull make) {
            make.left.right.bottom.equalTo(@0);
            make.top.equalTo(self.searchTxt.mas_bottom).offset(11);
        }];
        self.mainTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        self.mainTableView.separatorColor = COLOR(groupTableViewBackgroundColor);
      
        //开始定位
        [self.locationManager startUpdatingLocation];
    }
    
    
    #pragma mark - 点击取消按钮
    - (void)cancelAction:(UIButton *)sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    
    #pragma mark - AMapLocationManagerDelegate
    
    /* 当定位发生错误时,会调用代理的此方法 */
    - (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error
    {
        //定位错误
        LOG(@"定位❌error = %@",error);
    }
    
    /* 位置更新回调 */
    - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location
    {
        //经纬度
        LOG(@"location:{lat:%f; lon:%f}", location.coordinate.latitude, location.coordinate.longitude);
        
        self.location = location;
        
        //逆地理编码
        [self reGoecodeWithLocation:location];
        
        //发起周边搜索
        [self searchAroundWithKeywords:nil];
        
        //停止定位
        [self.locationManager stopUpdatingLocation];
    }
    
    //逆地理编码
    - (void)reGoecodeWithLocation:(CLLocation *)location
    {
        AMapReGeocodeSearchRequest *request = [[AMapReGeocodeSearchRequest alloc] init];
        request.location =[AMapGeoPoint locationWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];
        [self.searchAPI AMapReGoecodeSearch:request];
    }
    
    //根据定位坐标或关键字进行周边搜索
    - (void)searchAroundWithKeywords:(NSString *)keywords{
        if (keywords.length == 0) { //未输入关键字,则为POI周边搜索
            self.isSearchAround = YES;
            //构造AMapPOIAroundSearchRequest对象,设置周边搜索参数
            AMapPOIAroundSearchRequest *request = [[AMapPOIAroundSearchRequest alloc] init];
            request.location = [AMapGeoPoint locationWithLatitude:self.location.coordinate.latitude longitude:self.location.coordinate.longitude];
            //types属性表示限定搜索POI的类别,默认为:餐饮服务|商务住宅|生活服务
            //POI的类型共分为20种大类别
            request.types = @"汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施";
            
            request.sortrule = 0;
            request.requireExtension = YES;
            //发起周边搜索请求
            [self.searchAPI AMapPOIAroundSearch:request];
        }else{ //输入了关键字,则为搜索提示请求
            self.isSearchAround = NO;
            AMapInputTipsSearchRequest *tipsRequest = [[AMapInputTipsSearchRequest alloc] init];
            tipsRequest.city = self.currentCity;//查询城市默认为当前定位的城市
            tipsRequest.keywords = keywords;
            [self.searchAPI AMapInputTipsSearch:tipsRequest];
        }
    }
    
    
    #pragma mark - AMapSearchDelegate
    
    /* 逆地理编码查询回调函数 */
    - (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
    {
        self.currentCity = response.regeocode.addressComponent.city;
        if (self.currentCity.length == 0) {
            self.currentCity = response.regeocode.addressComponent.province;
        }
        LOG(@"当前定位城市 = %@",self.currentCity);
    }
    
    /* 实现POI搜索对应的回调函数 */
    - (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response
    {
        [self.addressArray removeAllObjects];
        if (response.pois.count>0) {
            //将搜索出的POI结果保存到数组
            [self.addressArray addObjectsFromArray:response.pois];
        }else{
            [self.mainTableView tableViewShowMessage:@"无结果" forDataCount:0];
        }
        [self.mainTableView reloadData];
    }
    
    /* 输入提示查询回调函数 */
    - (void)onInputTipsSearchDone:(AMapInputTipsSearchRequest *)request response:(AMapInputTipsSearchResponse *)response
    {
        [self.addressArray removeAllObjects];
        if (response.tips.count>0) {
            //将搜索出的结果保存到数组
            [self.addressArray addObjectsFromArray:response.tips];
        }else{
            [self.mainTableView tableViewShowMessage:@"无结果" forDataCount:0];
        }
        [self.mainTableView reloadData];
    }
    
    
    #pragma mark - <UITableViewDataSource,UITableViewDelegate>
    
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return self.addressArray.count;
    }
    
    -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        NSString *identifier = @"cellID";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
        }
        if (self.isSearchAround == YES) {//POI周边搜索
            AMapPOI *poi = self.addressArray[indexPath.row];
            cell.textLabel.text = poi.name;
            cell.detailTextLabel.text = poi.address;
        }else{//输入提示搜索
            AMapTip *tip = self.addressArray[indexPath.row];
            cell.textLabel.text = tip.name;
            cell.detailTextLabel.text = tip.address;
        }
        return cell;
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return 50;
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
        return 0.01;
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 0.01;
    }
    
    -(UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
        return nil;
    }
    
    -(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
        return nil;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    
    
    #pragma mark - 监听textField值改变
    - (void)textFieldValueChanged:(UITextField *)textField
    {
        [self searchAroundWithKeywords:textField.text];
    }
    
    #pragma mark - UITextFieldDelegate
    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [self.view endEditing:YES];
        return YES;
    }
    
    
    
    @end

     

    展开全文
  • iOS 高德地图开发详解

    2019-07-01 17:30:27
    配置环境(重点)高德地图提供了两种配置方式:2.1手动配置2.1.1引入地图库MAMapKit.framework 文件添加到工程中。2.1.2引入AMap.bundle资源文件AMap.bundle资源文件中存储了定位、默认大头针标注视图等图片

    Demo地址 如果有所帮助记得关注,点Star
    demo中添加了查看路况功能,如果不需要,可以删除。
    ##一:基本地图功能实现
    ####1.申请密钥流程
    申请密钥链接

    申请密钥1.png

    申请密钥2.png

    申请密钥3.png

    2.配置环境(重点)

    高德地图提供了两种配置方式:

    2.1手动配置

    2.1.1引入地图库

    MAMapKit.framework 文件添加到工程中。

    2.1.2引入AMap.bundle资源文件

    AMap.bundle资源文件中存储了定位、默认大头针标注视图等图片,可利用这些资源图片进行开发。
    左侧目录中选中工程名,在右键菜单中选择Add Files to “工程名”…,从MAMapKit.framework->Resources文件中选择AMap.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。
    资源文件不是必须的,可以自定义资源图片。

    2.1.3引入系统库
    1.  UIKit.framework 2D、3D、Search
    2.  Foundation.framework    2D、3D、Search
    3.  CoreGraphics.framework  2D、3D、Search
    4.  QuartzCore.framework    2D、3D
    5.  OpenGLES.framework  3D
    6.  CoreLocation.framework  2D、3D
    7.  CoreTelephony.framework 2D、3D、Search
    8.  SystemConfiguration.framework   2D、3D、Search
    9.  libz.dylib  2D、3D、Search
    10. libstdc++6.09.dylib 2D、3D、Search
    11. Security.framework  2D、3D
    
    2.1.4环境配置

    在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。
    V2.3.0(含)之前版本不支持arm64,需在 TARGETS->Build Settings->Architectures 点出选择框,选择 “Other”,将默认值修改为 $(ARCHS_STANDARD_32_BIT)。

    2.2自动配置,(使用 CocoaPods 安装 SDK)

    为 高德 iOS 地图 SDK 创建一个 Podfile,并使用它来安装 SDK。

    2.2.1创建Podfile文件

    在您当前工程文件(.xcodeproj)所在文件夹下创建一个名为 Podfile 的文件。如果您尚未创建 Xcode 项目,请立即创建一个并将其保存到您的本地计算机。 (如果您第一次接触 iOS 开发,请创建一个Single View Application。)

    $ touch Podfile
    
    2.2.2编辑 Podfile 文件

    Podfile文件内容如下:

    platform :ios, '7.0' #手机的系统 target 'YourProjectTarget' do pod 'AMap3DMap' #3D地图SDK #pod 'AMap2DMap' #2D地图SDK (2D和3D不能同时使用) pod 'AMapSearch' #搜索功能 end
    

    编辑 Podfile 文件

    2.2.3运行 pod install 命令安装SDK
    $pod install --repo-update
    

    1.1.0版本的pod,运行pod install 不会自动更新repo,如果下载的不是最新版,可使用pod install —repo-update 更新 或 先运行 pod repo update.

    2.2.4更新 SDK

    如果您安装的SDK不是最新版,请执行下面的代码进行更新。

    pod repo update
    
    2.2.5重启 Xcode

    关闭Xcode,然后打开(双击)您项目的 .xcworkspace 文件以启动 Xcode。 从此刻开始,您必须使用 .xcworkspace 文件打开项目。

    3.地图的使用

    3.1配置Info.plist 文件

    iOS9为了增强数据访问安全,将所有的http请求都改为了https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true></true>
    </dict>
    

    3.2配置高德Key至AppDelegate.m文件

    #import <AMapFoundationKit/AMapFoundationKit.h>
    //需要引入AMapFoundationKit.h头文件
    ……
    
     (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {  
        [AMapServices sharedServices].apiKey = @"您的Key";
         
        ……
    }
    

    3.3加载地图

    在ViewController.m文件相应的方法中进行地图初始化,初始化的步骤:

    1.import MAMapKit.h 头文件;
    2.构造MAMapView对象;
    3.将MAMapView添加到Subview中。

    对于3D矢量地图,在 viewDidLoad 方法中添加代码:

    #import <MAMapKit/MAMapKit.h>
    
    -(void) viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
    ///初始化地图
    MAMapView *_mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
        
    ///把地图添加至view
        [self.view addSubview:_mapView];
    }
    

    到此地图的基本功能就完成了
    Demo地址 如果有所帮助记得关注,点Star
    demo中添加了查看路况功能,如果不需要,可以删除。

    ##二:自定义地图功能
    在上面功能的基础上我们可以针对需求,自定义地图功能,下面我就列举出常用功能设置方法:

    1.地图Logo

    默认的Logo为蓝色字样的“高德地图”,显示在地图的左下方。地图Logo不能移除,但可通过MAMapView.logoCenter属性来调整Logo的显示位置。在ViewController.m的viewDidLoad方法添加如下如下:

    _mapView.logoCenter = CGPointMake(CGRectGetWidth(self.view.bounds)-55, 450);
    

    2.指南针

    指南针默认是开启状态,显示在地图的右上角。
    通过MAMapView的showsCompass属性用来控制指南针的可见性。compassOrigin属性可改变指南针的显示位置。在ViewController.m的viewDidLoad方法添加如下如下:

    _mapView.showsCompass= YES; // 设置成NO表示关闭指南针;YES表示显示指南针
    _mapView.compassOrigin= CGPointMake(_mapView.compassOrigin.x, 22); //设置指南针位置
    

    3.比例尺

    比例尺表示地图上两点间距离与实际与之对应的两点距离的比,在不同的缩放级别下,比例尺代表的长度也是不同的。
    在iOS SDK中,比例尺默认显示在地图的左上角。MAMapView的showScale属性用来控制比例尺的可见性,scaleOrigin属性用来改变比例尺的显示位置。在ViewController.m的viewDidLoad方法添加如下代码:

    _mapView.showScale= YES;  //设置成NO表示不显示比例尺;YES表示显示比例尺
    _mapView.scaleOrigin= CGPointMake(_mapView.scaleOrigin.x, 22);  //设置比例尺位置
    

    4.手势控制

    //缩放手势
    _mapView.zoomEnabled = NO;    //NO表示禁用缩放手势,YES表示开启
    //平移(滑动)手势
    _mapView.scrollEnabled = NO;    //NO表示禁用滑动手势,YES表示开启
    //旋转手势(3D)
    _mapView.rotateEnabled= NO;    //NO表示禁用旋转手势,YES表示开启
    //倾斜手势(3D)
    _mapView.rotateCameraEnabled= NO;    //NO表示禁用倾斜手势,YES表示开启
    

    5.地图操作

    地图缩放
    地图的缩放级别的范围是[3-19],调用MAMapView的setZoomLevel方法设置地图的缩放级别,用来缩放地图。示例代码如下:

    [_mapView setZoomLevel:17.5 animated:YES];
    

    地图平移

    [_mapView setCenterCoordinate:center animated:YES];
    

    地图旋转(3D)
    旋转角度的范围是[0.f 360.f],以逆时针为正向。示例代码如下:

    [_mapView setRotationDegree:60.f animated:YES duration:0.5];
    

    地图倾斜(3D)
    倾斜角度范围为[0.f, 45.f],示例代码如下:

    [_mapView setCameraDegree:30.f animated:YES duration:0.5];
    

    6.地图截屏

    CGRect inRect = CGRectMake(80,142,160,284);
    UIImage *screenshotImage = [_mapView takeSnapshotInRect:inRect] ;
    

    7.卫星图

    //显示卫星地图
    _mapView.mapType = MAMapTypeSatellite;
    

    说明:地图类型切换只需将地图类型设置成相应的类型

    8. 实时交通图

    显示实时交通路况的代码如下:

    _mapView.showTraffic= YES;
    

    9.定位功能

    9.1开启定位

    _mapView.showsUserLocation = YES; //YES 为打开定位,NO为关闭定位
    当位置更新时,会进定位回调,通过回调函数,能获取到定位点的经纬度坐标:

    -(void)mapView:(MAMapView*)mapView didUpdateUserLocation: (MAUserLocation*)userLocation updatingLocation:(BOOL)updatingLocation
    
    9.2后台定位

    app退到后台,且位置不变动时,也不会被系统挂起,可持久记录位置信息。
    1.添加代码

    _mapView.pausesLocationUpdatesAutomatically = NO;
    

    2.工程配置
    1)左侧目录中选中工程名,开启 TARGETS->Capabilities->Background Modes
    2)在 Background Modes中勾选 Location updates

    10.大头针标注

    地图标注在开发中经常使用,并且地图标注样式灵活,需要着重注意。
    在地图的基础,添加地图标注,需要两步

    1. 创建地图标注MAPointAnnotation,添加地图标注[_mapView addAnnotation:annotation];
    2. mapView:viewForAnnotation:回调函数,设置标注样式。
      这里添加标注的代理方法,也可以把当前位置当做标注一样去显示出来,比较灵活。

    11.自定义标注

    自定义标注图标(基于大头针标注,可以自定义样式)

    (1) 添加标注数据对象,可参考大头针标注的步骤(1)。
    (2) 导入标记图片文件到工程中。这里我们导入一个名为restauant.png的图片文件。
    (3) 在 协议的回调函数mapView:viewForAnnotation:中修改MAAnnotationView对应的标注图片。
    关键代码:

    annotationView.image = [UIImage imageNamed:@"restaurant"];
    //设置中⼼心点偏移,使得标注底部中间点成为经纬度对应点
    annotationView.centerOffset = CGPointMake(0, -18);
    

    详见官方文档

    展开全文
  • 环境: Xcode10.1 ...高德地图API使用 需要(https://lbs.amap.com)申请开发者账号,创建应用,获取对应平台的key。 查看API(https://lbs.amap.com/api),也可到 示例代码 中获取官方de...

    环境:

    Xcode10.1

    Swift4.2

    真机6s,ios11

    Demohttps://github.com/cxymq/AmapSwift

     

    高德地图API使用

     

    1. 需要(https://lbs.amap.com)申请开发者账号,创建应用,获取对应平台的key。

    2. 查看API(https://lbs.amap.com/api),也可到 示例代码 中获取官方demo。

    3. 具体实现:

    第一步:cocoapod导入SDK,会引入基础SDK,默认集成了 IDFA 服务,提交AppSote请看https://lbs.amap.com/api/ios-location-sdk/guide/create-project/idfa-guide/

    pod 'AMapLocation'

    注意:1.如果不想集成  IDFA服务,需要pod AMapLocation-NO-IDFA。

               2.为了能够正常使用地图API,需要引入桥接头文件AmapSwift_Bridging_Header_h,并且在TARGETS->Build Settings-> Swift Compiler - Code Generation -> Objective-C Bridging Header 引入路径。

    具体查看demo(https://github.com/cxymq/AmapSwift)。

     

    第二步:申请权限

    iOS11,在info.plist文件中添加以下字段:

    NSLocationAlwaysAndWhenInUseUsageDescription和 NSLocationWhenInUseUsageDescription字段。

     

    注意:

    错误:Xcode会报错误==>library not found for -lstdc++.6.0.9’

    原因:Xcode10.0以上,Apple废除了 libstdc++6.0.9(即lstdc++6.0.9),需要将其重新加入lib路径。

    解决方法(参考https://www.jianshu.com/p/35d34828e607):下载libstdc++库,下载链接,提取码arms

    将 libstdc++、libstdc++.6、libstdc++6.0.9拷贝到Xcode的如下目录:

    1.真机环境:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/

    2.模拟器环境:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/

     

    第三步:构建项目

    本Demo的控件大多是故事板拖拽完成,因 UISearchController 未找到相应的控件,使用代码构建。当然,所有拖拽空间皆可由代码完成。

    初步学习集成可以先参考Demo中 单次定位部分内容,后续学习参考 搜索定位。Demo中有注释。

     

    1.单次定位

    用到 定位管理类(AMapLocationManager)、周边搜索设置类(AMapPOIAroundSearchRequest)、搜索类(AMapSearchAPI)和 地图视图类(MAMapView:用于显示地图、标注注解)。

     

    初始化AMapLocationManager

            //初始化AMapLocationManager对象,设置代理。
    		locationManager = AMapLocationManager()
    		locationManager?.delegate = self
    		// 带逆地理信息的一次定位(返回坐标和地址信息)
    		locationManager?.desiredAccuracy = kCLLocationAccuracyHundredMeters
    		//   定位超时时间,最低2s,此处设置为2s
    		locationManager?.locationTimeout = 2
    		//   逆地理请求超时时间,最低2s,此处设置为2s
    		locationManager?.reGeocodeTimeout = 2

     

    设置搜索项AMapPOIAroundSearchRequest

            searchRequest = AMapPOIAroundSearchRequest.init()
    		///查询关键字,多个关键字用“|”分割
    		searchRequest?.keywords = "商务住宅|餐饮服务|生活服务"
    		///排序规则0-距离排序;1-综合排序, 默认0
    		searchRequest?.sortrule = 0
    		///每页记录数, 范围1-50, [default = 20]
    		searchRequest?.offset = 50
    		///是否返回扩展信息,默认为 NO。
    		searchRequest?.requireExtension = true

     

    请求带逆地理

    // 带逆地理(返回坐标和地址信息)。将下面代码中的 true 改成 false ,则不会返回地址信息。
    		locationManager?.requestLocation(withReGeocode: true, completionBlock: { (location: CLLocation?, reGeocode: AMapLocationReGeocode?, error: Error?) in
    			
    			if let error = error {
    				let error = error as NSError
    				
    				if error.code == AMapLocationErrorCode.locateFailed.rawValue {
    					//定位错误:此时location和regeocode没有返回值,不进行annotation的添加
    					NSLog("定位错误:{\(error.code) - \(error.localizedDescription)};")
    					return
    				}
    				else if error.code == AMapLocationErrorCode.reGeocodeFailed.rawValue
    					|| error.code == AMapLocationErrorCode.timeOut.rawValue
    					|| error.code == AMapLocationErrorCode.cannotFindHost.rawValue
    					|| error.code == AMapLocationErrorCode.badURL.rawValue
    					|| error.code == AMapLocationErrorCode.notConnectedToInternet.rawValue
    					|| error.code == AMapLocationErrorCode.cannotConnectToHost.rawValue {
    					
    					//逆地理错误:在带逆地理的单次定位中,逆地理过程可能发生错误,此时location有返回值,regeocode无返回值,进行annotation的添加
    					NSLog("逆地理错误:{\(error.code) - \(error.localizedDescription)};")
    				}
    				else {
    					//没有错误:location有返回值,regeocode是否有返回值取决于是否进行逆地理操作,进行annotation的添加
    				}
    			}
    			
    			var addressInfo: String = ""
    			
    			
    			if let location = location {
    				NSLog("location:%@", location)
    				
    				addressInfo.append("经纬度:\(location.coordinate) \n")
    			}
    			
    			if let reGeocode = reGeocode {
    				NSLog("reGeocode:%@", reGeocode)
    				
    				addressInfo.append("国家:\(String(describing: reGeocode.country))\n")
    				addressInfo.append("省份:\(String(describing: reGeocode.province))\n")
    				addressInfo.append("城市:\(String(describing: reGeocode.city))\n")
    				addressInfo.append("区:\(String.init(format: "%@", reGeocode.district))\n")
    				addressInfo.append("街道:\(String.init(format: "%@", reGeocode.street))\n")
    				addressInfo.append(contentsOf: "详细地址:\(String(describing: reGeocode.formattedAddress))\n")
    			}
    			
    			self.textView.text = addressInfo
    		})

     

    2.搜索定位

    用到 定位管理类(AMapLocationManager)、周边搜索设置类(AMapPOIAroundSearchRequest)、搜索类(AMapSearchAPI)和 地图视图类(MAMapView:用于显示地图、标注注解)。还有搜索控制器(UISearchController)等。

    Demo中定义多个属性,都标有详细注释。如 dataArr(定位的周边结果)、tips(搜索返回的搜索结果)、tableView(显示周边结果)、searchResultview(显示搜索的结果)。

     


    个人博客:https://blog.csdn.net/Crazy_SunShine

    Github:https://github.com/cxymq

    个人公众号:Flutter小同学

    个人网站:http://chenhui.today/

    展开全文
  • 因为在iOS开发中我们经常会用到很多的第三方库,为了方便管理所以使用Cocoapods。 如何安装CocoaPods? 1,现在检查Ruby环境:(mac是自带了Ruby环境的,为了安全起见我们还是检查下)打开终端输入:ruby -v ...

    环境:macOS Sierra 版本10.12.2

    为什么使用CocoaPods?因为在iOS开发中我们经常会用到很多的第三方库,为了方便管理所以使用Cocoapods。


    如何安装CocoaPods?

    1,现在检查Ruby环境:(mac是自带了Ruby环境的,为了安全起见我们还是检查下)打开终端输入:ruby -v 就可以看到是否安装了。

    2,更改Ruby的镜像,不然安装不了CocoaPods。在终端输入:

    gem sources --remove https://rubygems.org/

    gem sources -a https://ruby.taobap.org/

    gem sources -l (用于检查是否改成功)

    注:成功之后会看到如下字样:

    *** CURRENT SOURCES ***

    3,下载安装Cocoapods

    在终端输入:sudo gem install cocoapods

    然后等待一会就安装好了,会出现如下信息:


    这样CocoaPods就安装好了。


    如何使用CocoaPods集成第三方库:

    1,创建一个Xcode工程,如:GMapDemo

    2,在终端,cd到项目的根目录

    3,建立Podfile(配置文件),在终端输入: vim Podfile 会出现如下界面


    然后按 i 健进入编辑模式:(这里我们以集成高德地图sdk为例)在终端输入如下配置信息:

    platform :ios,'7.0'

    target 'GMapDemo(你自己的项目名称)' do

     pod 'AMap3DMap'

     pod 'AMapSearch'

    end

     注:以上配置信息是从高德地图API中得到。根据以上格式你可以下载你自己所需求的第三方库。

    输入完之后按ESC键,再输入“:”号 进入vim命令模式,然后在冒号后面输入wq,会车你回发现在你的项目工程中回多出一个Podfile文件。

    接着在终端输入: pod install 稍微等一小会就集成好了高德地图api了,如图:


    这样就完成了,需要注意的是这个时候打开的就不是 .xcodeproj这个后缀的文件了 而是.xcworkspace这个文件了。

    展开全文
  • iOS仿链家地图找房-高德地图找房-需要自行用pod集成地图api
  • 导入高德地图API 正好在前段时间学习了CocoaPods,我们直接在Podfile文件中pod我们需要的API: 考虑到使用IDFA上线的时候要做出说明并且处理一下,提高了被拒风险,我们选择使用不集成 IDFA 版本的 SDK: platform :...
  • 项目中想加入地图功能,使用高德地图第三方,想要实现确定一个位置,搜索路线并且显示的方法。耗了一番功夫,总算实现了。一、配置工作1.申请key访问 http://lbs.amap.com/dev/key/ 在高度地图第三方开发平台申请一...
  • Podfile文件platform :ios, '8.0' target 'yourapp' do pod 'AMapLocation' end然后,pod installInfo.plist<key>NSLocationAlwaysUsageDescription 家教100 请求后台定位权限 <key>UIBackgroundModes</key>
  • 1、输入命令【找到你项目的文件夹】:cd "你的工程目录路径名称",如我的输入:cd /Users/lxh/Desktop/myMapProject/ 2、输入命令【创建一个podfile文件】:touch podfile, 输入完命令之后,系统在你工程文件创建了...
  • iOS中有三个定位服务组件: (1)Wifi定位,通过查询一个Wifi路由器的地理位置的信息。比较省电,iPod touch和iPad也可以采用。 (2)蜂窝基站定位,通过移动运用商基站定位。也适合有3G版本的iPod touch和iPad (3...
  • 1.使用pod的方法导入高德SDK pod 'AMap2DMap-NO-IDFA'#2D高德地图 pod 'AMapSearch-NO-IDFA'#高德地图搜索 pod 'AMapLocation-NO-IDFA'#高德地图定位 pod install 2.创建一个控制器实现简单的地图运用:...
  • IOS高德地图使用说明

    2019-10-08 15:51:19
    关于高德地图1目的为了更方便的使用,以及避免犯错 2 集成步骤2.1 申请密钥详见:http://lbs.amap.com/api/ios-sdk/guide/verify/ 高德地图iOS SDK开发密钥的申请地址为:http://lbs.amap.com/console/key/ 需要...
  • 一.先前准备 ...1.1).sdk下载http://lbs.amap.com/api/ios-sdk/summary/,推荐pod导入,其他添加依赖库请参考官方文档 1.0.png 1.2).在用到的vc导入,还有遵循协议,这里还要谢谢简书一位仁兄,因为最
  • IOS 高德地图SDK

    2019-08-07 18:25:04
    文章目录高德SDK简介高德地图Key申请高德地图SDK的安装其他配置地图SDK简介MAMapView类简介简单使用绘制地图标注举例:默认样式标注点定位SDK代码 高德SDK简介 高德开放平台将高德最专业的定位、地图、搜索、导航等...
  • 最近看了看高德地图的开发平台以及它们的API,奇怪的是一直没找到语音API,这个问题放到以后再说吧。 对于高德地图的开发平台,它们提供的说明文档还算健全,而且由于API是国人开发的,所以所有接口都有中文的接口...
  • 项目中想加入地图功能,使用高德地图第三方,想要实现确定一个位置,搜索路线并且显示的方法。耗了一番功夫,总算实现了。 效果 WeChat_1462507820.jpeg 一、配置工作 1.申请key 访问 ...
1 2 3 4 5 ... 20
收藏数 400
精华内容 160
热门标签