iOS地圖定位(定位铅搓、地理編碼與反地理編碼、mapView搀捷、大頭針星掰、導航)

地圖定位.jpg

在我們的生活中現(xiàn)在很多App大多都可以獲取地理位置進行相關(guān)的定位標記等,有的例如餐飲App,當我們需要訂餐時,我們需要知道商家的地理位置,以方便我們能夠知道送餐人員大概需要多久可以將食物送到我們面前,當我們需要查找某個餐廳的時候,我們只需要在搜索框中搜索相應的店名,我們的App就能迅速的在地圖上幫我們標注出來,以方便我們查看,當我們需要去一個陌生的地方的時候,我們可以很輕松的通過導航功能,去往我們想要去得任何地方,而這些都得益于蘋果為我們提供的定位服務。

  • 首先要實現(xiàn)地圖、導航功能氢烘,就需要我們先熟悉定位功能便斥,在iOS中通過Core Location框架進行定位操作。Core Location自身可以單獨使用威始,和地圖開發(fā)框架MapKit完全是獨立的枢纠,但是往往地圖開發(fā)要配合定位框架使用。在Core Location中主要包含了定位黎棠、地理編碼(包括反編碼)功能晋渺。
  • 由于目前蘋果iOS系統(tǒng)最新版本為9.1,蘋果自iOS8以后如果要使用定位服務,需要我們在plist文件中多添加兩個字段,其實就是提示用戶授權(quán)的用的,就是以下兩個字段:
 NSLocationWhenInUseUsageDescription  當用戶使用的允許        
 NSLocationAlwaysUsageDescription     總是允許
 

定位服務授權(quán)狀態(tài)枚舉類型說明:

  //定位服務授權(quán)狀態(tài),返回枚舉類型:
    //kCLAuthorizationStatusNotDetermined: 用戶尚未做出決定是否啟用定位服務
    //kCLAuthorizationStatusRestricted: 沒有獲得用戶授權(quán)使用定位服務,可能用戶沒有自己禁止訪問授權(quán)
    //kCLAuthorizationStatusDenied :用戶已經(jīng)明確禁止應用使用定位服務或者當前系統(tǒng)定位服務處于關(guān)閉狀態(tài)
    //kCLAuthorizationStatusAuthorizedAlways: 應用獲得授權(quán)可以一直使用定位服務脓斩,即使應用不在使用狀態(tài)
    //kCLAuthorizationStatusAuthorizedWhenInUse: 使用此應用過程中允許訪問定位服務

獲取當前位置

ViewController.m

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic,strong)CLLocationManager *locationManager;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //初始化locationManger管理器對象
    CLLocationManager *locationManager=[[CLLocationManager alloc]init];
    self.locationManager=locationManager;
    
    //判斷當前設(shè)備定位服務是否打開
    if (![CLLocationManager locationServicesEnabled]) {
        NSLog(@"設(shè)備尚未打開定位服務");
    }

    //判斷當前設(shè)備版本大于iOS8以后的話執(zhí)行里面的方法
    if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {
        //持續(xù)授權(quán)
        [locationManager requestAlwaysAuthorization];
        //當用戶使用的時候授權(quán)
        [locationManager requestWhenInUseAuthorization];
    }
    
    //或者使用這種方式,判斷是否存在這個方法,如果存在就執(zhí)行,沒有的話就忽略
    //if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
    //   [locationManager requestWhenInUseAuthorization];
    //}
    
    //設(shè)置代理
    locationManager.delegate=self;
    //設(shè)置定位的精度
    locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    //設(shè)置定位的頻率,這里我們設(shè)置精度為10,也就是10米定位一次
    CLLocationDistance distance=10;
    //給精度賦值
    locationManager.distanceFilter=distance;
    //開始啟動定位
    [locationManager startUpdatingLocation];

}
//當位置發(fā)生改變的時候調(diào)用(上面我們設(shè)置的是10米,也就是當位置發(fā)生>10米的時候該代理方法就會調(diào)用)
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    //取出第一個位置
    CLLocation *location=[locations firstObject];
    NSLog(@"%@",location.timestamp);
    //位置坐標
    CLLocationCoordinate2D coordinate=location.coordinate;
    NSLog(@"經(jīng)度:%f,緯度:%f,海拔:%f,航向:%f,速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
    //如果不需要實時定位木西,使用完即使關(guān)閉定位服務
    //[_locationManager stopUpdatingLocation];
}


2015-11-29 13:02:48.380 地圖定位[1022:55837] 2015-11-29 05:02:06 +0000
2015-11-29 13:02:48.381 地圖定位[1022:55837] 您的當前位置:經(jīng)度:-116.206410,緯度:39.285834,海拔:0.000000,航向:-1.000000,速度:-1.000000
2015-11-29 13:02:48.383 地圖定位[1022:55837] 2015-11-29 05:02:48 +0000
2015-11-29 13:02:48.383 地圖定位[1022:55837] 您的當前位置:經(jīng)度:-116.206410,緯度:39.285834,海拔:0.000000,航向:-1.000000,速度:-1.000000
2015-11-29 13:03:03.081 地圖定位[1022:55837] 2015-11-29 05:03:03 +0000
2015-11-29 13:03:03.081 地圖定位[1022:55837] 您的當前位置:經(jīng)度:-116.306410,緯度:39.285834,海拔:0.000000,航向:-1.000000,速度:-1.000000
2015-11-29 13:03:34.226 地圖定位[1022:55837] 2015-11-29 05:03:34 +0000
2015-11-29 13:03:34.226 地圖定位[1022:55837] 您的當前位置:經(jīng)度:-116.406400,緯度:39.285834,海拔:0.000000,航向:-1.000000,速度:-1.000000
2015-11-29 13:03:57.659 地圖定位[1022:55837] 2015-11-29 05:03:57 +0000
2015-11-29 13:03:57.659 地圖定位[1022:55837] 您的當前位置:經(jīng)度:-116.506400,緯度:39.285834,海拔:0.000000,航向:-1.000000,速度:-1.000000


根據(jù)經(jīng)緯度計算兩地的距離

ViewController.m

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()
@property (nonatomic,strong)CLLocationManager *locationManager;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //創(chuàng)建位置管理器
    CLLocationManager *locationManager=[[CLLocationManager alloc]init];
    self.locationManager=locationManager;
    
    //判斷當前設(shè)備版本是否大于或等于8.0
    if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {
        //持續(xù)授權(quán)
        //[locationManager requestAlwaysAuthorization];
        //使用期間授權(quán)
        [locationManager requestWhenInUseAuthorization];
    }
    //iOS 9.0以后蘋果提供的新屬性
    if ([UIDevice currentDevice].systemVersion.floatValue >9.0) {
        //是否允許后臺定位
        locationManager.allowsBackgroundLocationUpdates=YES;
    }
    
    //開始定位
    [locationManager startUpdatingLocation];
    //比較兩點距離
    [self compareDistance];
}

//比較兩地之間距離(直線距離)
- (void)compareDistance{
    //北京 (116.3,39.9)
    CLLocation *location1=[[CLLocation alloc]initWithLatitude:39.9 longitude:116.3];
    //鄭州 (113.42,34.44)
    CLLocation *location2=[[CLLocation alloc]initWithLatitude:34.44 longitude:113.42];
    //比較北京距離鄭州的距離
    CLLocationDistance locationDistance=[location1 distanceFromLocation:location2];
    //單位是m/s 所以這里需要除以1000
    NSLog(@"北京距離鄭州的距離為:%f",locationDistance/1000);

}

運行結(jié)果:

2015-11-29 16:36:44.742 測量兩點間距離[1500:125741] 北京距離鄭州的距離為:657.622676

地理編碼與反地理編碼

  • 地理編碼:根據(jù)地址獲得相應的經(jīng)緯度以及詳細信息
  • 反地理編碼:根據(jù)經(jīng)緯度獲取詳細的地址信息(比如:省市、街區(qū)随静、樓層八千、門牌等信息)

地理編碼與反地理編碼用到得兩個方法

//地理編碼
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

//反地理編碼
 - (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

地理編碼的使用

ViewController.m

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()
//地址
@property (weak, nonatomic) IBOutlet UITextField *addressTextField;
//經(jīng)度
@property (weak, nonatomic) IBOutlet UITextField *longitudeTextField;
//緯度
@property (weak, nonatomic) IBOutlet UITextField *latitudeTextField;
//詳細地址
@property (weak, nonatomic) IBOutlet UITextView *textView;

@end

@implementation ViewController

//地理編碼
- (IBAction)genocoder:(id)sender {
    //創(chuàng)建編碼對象
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    //判斷是否為空
    if (self.addressTextField.text.length ==0) {
        return;
    }
    [geocoder geocodeAddressString:self.addressTextField.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (error!=nil || placemarks.count==0) {
            return ;
        }
        //創(chuàng)建placemark對象
        CLPlacemark *placemark=[placemarks firstObject];
        //賦值經(jīng)度
        self.longitudeTextField.text =[NSString stringWithFormat:@"%f",placemark.location.coordinate.longitude];
        //賦值緯度
        self.latitudeTextField.text=[NSString stringWithFormat:@"%f",placemark.location.coordinate.latitude];
        //賦值詳細地址
        self.textView.text=placemark.name;
    }];
    
}

反地理編碼的使用

AntiEncoderController.m

#import "AntiEncoderController.h"
#import <CoreLocation/CoreLocation.h>

@interface AntiEncoderController ()
//經(jīng)度
@property (weak, nonatomic) IBOutlet UITextField *longitudeTextField;
//緯度
@property (weak, nonatomic) IBOutlet UITextField *latitudeTextField;
//詳細地址
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end

@implementation AntiEncoderController

//反地理編碼
- (IBAction)AntiEncoder:(id)sender {
    //創(chuàng)建地理編碼對象
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    //創(chuàng)建位置
    CLLocation *location=[[CLLocation alloc]initWithLatitude:[self.latitudeTextField.text floatValue] longitude:[self.longitudeTextField.text floatValue]];
    
    //反地理編碼
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        //判斷是否有錯誤或者placemarks是否為空
        if (error !=nil || placemarks.count==0) {
            NSLog(@"%@",error);
            return ;
        }
        for (CLPlacemark *placemark in placemarks) {
            //賦值詳細地址
            self.textView.text=placemark.name;
        }
        
    }];
    
}


mapView的使用

ViewController.m

#import "ViewController.h"
#import <MapKit/MapKit.h>

@interface ViewController ()<MKMapViewDelegate>
//mapView
@property (weak, nonatomic) IBOutlet MKMapView *mapView;

@property (nonatomic,strong)CLLocationManager *locationManager;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    CLLocationManager *locationManager=[[CLLocationManager alloc]init];
    self.locationManager=locationManager;
    
    //請求授權(quán)
    [locationManager requestWhenInUseAuthorization];

    /*
     MKUserTrackingModeNone  不進行用戶位置跟蹤
     MKUserTrackingModeFollow  跟蹤用戶的位置變化
     MKUserTrackingModeFollowWithHeading  跟蹤用戶位置和方向變化
     */
    //設(shè)置用戶的跟蹤模式
    self.mapView.userTrackingMode=MKUserTrackingModeFollow;
    /*
     MKMapTypeStandard  標準地圖
     MKMapTypeSatellite    衛(wèi)星地圖
     MKMapTypeHybrid      鳥瞰地圖
     MKMapTypeSatelliteFlyover
     MKMapTypeHybridFlyover
     */
    self.mapView.mapType=MKMapTypeStandard;
    //實時顯示交通路況
    self.mapView.showsTraffic=YES;
    //設(shè)置代理
    self.mapView.delegate=self;
    
}

//跟蹤到用戶位置時會調(diào)用該方法
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    //創(chuàng)建編碼對象
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    //反地理編碼
    [geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (error!=nil || placemarks.count==0) {
            return ;
        }
        //獲取地標
        CLPlacemark *placemark=[placemarks firstObject];
        //設(shè)置標題
        userLocation.title=placemark.locality;
        //設(shè)置子標題
        userLocation.subtitle=placemark.name;
    }];
    
}

//回到當前位置
- (IBAction)backCurrentLocation:(id)sender {
    
    MKCoordinateSpan span=MKCoordinateSpanMake(0.021251, 0.016093);
    
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.coordinate, span) animated:YES];
}

//當區(qū)域改變時調(diào)用
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    //獲取系統(tǒng)默認定位的經(jīng)緯度跨度
    NSLog(@"維度跨度:%f,經(jīng)度跨度:%f",mapView.region.span.latitudeDelta,mapView.region.span.longitudeDelta);
}

//縮小地圖
- (IBAction)minMapView:(id)sender {
   
    //獲取維度跨度并放大一倍
    CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 2;
    //獲取經(jīng)度跨度并放大一倍
    CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 2;
    //經(jīng)緯度跨度
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    //設(shè)置當前區(qū)域
    MKCoordinateRegion region = MKCoordinateRegionMake(self.mapView.centerCoordinate, span);
    
    [self.mapView setRegion:region animated:YES];
}

//放大地圖
- (IBAction)maxMapView:(id)sender {
    
    //獲取維度跨度并縮小一倍
    CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;
    //獲取經(jīng)度跨度并縮小一倍
    CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 0.5;
    //經(jīng)緯度跨度
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    //設(shè)置當前區(qū)域
    MKCoordinateRegion region = MKCoordinateRegionMake(self.mapView.centerCoordinate, span);
    
    [self.mapView setRegion:region animated:YES];

}

向mapView上添加大頭針

  • 只要我們的NSObject實現(xiàn)MKAnnotation協(xié)議,就可以作為一個大頭針供我們使用,通常我們在我們的類中要重寫協(xié)議中coordinate(標記位置)、title(標題)燎猛、subtitle(子標題)三個屬性恋捆,然后在程序中創(chuàng)建大頭針對象并調(diào)用addAnnotation:方法添加大頭針即可

ZKAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
//遵循協(xié)議
@interface ZKAnnotation : NSObject<MKAnnotation>
//經(jīng)緯度
@property (nonatomic)CLLocationCoordinate2D coordinate;
//父標題
@property (nonatomic,copy)NSString *title;
//子標題
@property (nonatomic,copy)NSString *subtitle;

@end

ViewController.h

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import "ZKAnnotation.h"

@interface ViewController ()<MKMapViewDelegate>
//mapView視圖
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    ZKAnnotation *annotation=[[ZKAnnotation alloc]init];
    annotation.coordinate=CLLocationCoordinate2DMake(39.9, 116);
    annotation.title=@"我是父標題";
    annotation.subtitle=@"我是子標題";
    
    self.mapView.delegate=self;
    //添加大頭針到北京
    [self.mapView addAnnotation:annotation];
}
//當點擊屏幕的時候調(diào)用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //獲取用戶點擊的位置
    CGPoint point=[[touches anyObject]locationInView:self.mapView];
    //將具體的位置轉(zhuǎn)換為經(jīng)緯度
    CLLocationCoordinate2D coordinate=[self.mapView convertPoint:point toCoordinateFromView:self.mapView];

    //添加大頭針
    ZKAnnotation *annotation=[[ZKAnnotation alloc]init];
    annotation.coordinate=coordinate;
    
    //反地理編碼
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    CLLocation *location=[[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (error==nil && placemarks.count==0) {
            NSLog(@"錯誤信息:%@",error);
            return ;
        }
        //獲取地標信息
        CLPlacemark *placemark=[placemarks firstObject];
        //獲取父標題名稱
        annotation.title=placemark.locality;
        //獲取子標題名稱
        annotation.subtitle=placemark.name;

        //添加大頭針到地圖
        [self.mapView addAnnotation:annotation];
    }];
    
}


效果如下

mapView.gif

動態(tài)添加大頭針到地圖

ZKAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface ZKAnnotation : NSObject<MKAnnotation>
//經(jīng)緯度
@property (nonatomic) CLLocationCoordinate2D coordinate;
//標題
@property (nonatomic, copy) NSString *title;
//子標題
@property (nonatomic, copy) NSString *subtitle;
@end

ViewController.m

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import "ZKAnnotation.h"

@interface ViewController ()<MKMapViewDelegate>
//創(chuàng)建管理者
@property (nonatomic,strong)CLLocationManager *locationManager;
//mapView
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.創(chuàng)建大頭針模型
    ZKAnnotation *annotation = [[ZKAnnotation alloc] init];
    annotation.coordinate = CLLocationCoordinate2DMake(39.9, 116);
    annotation.title = @"北京";
    annotation.subtitle = @"默認顯示的為首都北京";
    
    //添加第一個大頭針模型
    [self.mapView addAnnotation:annotation];
    //設(shè)置代理
    self.mapView.delegate = self;
    
    //請求授權(quán)
    self.locationManager = [[CLLocationManager alloc] init];
    [self.locationManager requestWhenInUseAuthorization];
    
    //設(shè)置用戶跟蹤模式
    //self.mapView.userTrackingMode = MKUserTrackingModeFollow;
}

//點擊屏幕的時候調(diào)用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //獲取用戶點擊的位置
    CGPoint point=[[touches anyObject]locationInView:self.mapView];
    //將具體的位置轉(zhuǎn)換為經(jīng)緯度
    CLLocationCoordinate2D coordinate=[self.mapView convertPoint:point toCoordinateFromView:self.mapView];
    
    //添加大頭針
    ZKAnnotation *annotation=[[ZKAnnotation alloc]init];
    annotation.coordinate=coordinate;
    
    //反地理編碼
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    CLLocation *location=[[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (error==nil && placemarks.count==0) {
            NSLog(@"錯誤信息:%@",error);
            return ;
        }
        //獲取地標信息
        CLPlacemark *placemark=[placemarks firstObject];
        //獲取父標題名稱
        annotation.title=placemark.locality;
        //獲取子標題名稱
        annotation.subtitle=placemark.name;
        
        //添加大頭針到地圖
        [self.mapView addAnnotation:annotation];
    }];

}

//創(chuàng)建大頭針時調(diào)用
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    //如果返回空,代表大頭針樣式交由系統(tǒng)去管理
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }
    static NSString *ID = @"annotation";
    // MKAnnotationView 默認沒有界面  可以顯示圖片
    // MKPinAnnotationView有界面      默認不能顯示圖片
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
    if (annotationView == nil) {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
        //設(shè)置大頭針顏色
        annotationView.pinTintColor = [UIColor redColor];
        //設(shè)置為動畫掉落的效果
        annotationView.animatesDrop = YES;
        //顯示詳情
        annotationView.canShowCallout = YES;
    }
    return annotationView;
}
@end

效果如下

動態(tài)添加大頭針.gif

導航

除了可以使用MapKit框架進行地圖開發(fā),對地圖有精確的控制和自定義之外重绷,如果對于應用沒有特殊要求的話選用蘋果自帶的地圖應用也是一個不錯的選擇沸停。想使用蘋果自帶的地圖,我們需要用到MapKit中的MKMapItem類,這個類中有如下兩個方法:

  • openInMapsWithLaunchOptions:用于在地圖上標注一個位置
  • openMapsWithItems: launchOptions:除了可以標注多個位置外還可以進行多個位置之間的駕駛導航
MKLaunchOptionsDirectionsModeKey :路線模式,常量
  • MKLaunchOptionsDirectionsModeDriving 駕車模式
  • MKLaunchOptionsDirectionsModeWalking 步行模式
MKLaunchOptionsMapTypeKey:地圖類型昭卓,枚舉
  • MKMapTypeStandard :標準模式
  • MKMapTypeSatellite :衛(wèi)星模式
  • MKMapTypeHybrid :混合模式
MKLaunchOptionsMapCenterKey:中心點坐標愤钾,CLLocationCoordinate2D類型
MKLaunchOptionsMapSpanKey:地圖顯示跨度,MKCoordinateSpan 類型
MKLaunchOptionsShowsTrafficKey:是否 顯示交通狀況候醒,布爾型
MKLaunchOptionsCameraKey:3D地圖效果能颁,MKMapCamera類型

注意:此屬性從iOS7及以后可用,前面的屬性從iOS6開始可用

ViewController.m

#import "ViewController.h"
#import <MapKit/MapKit.h>

@interface ViewController ()
//地址
@property (weak, nonatomic) IBOutlet UITextField *addressText;

@end

@implementation ViewController

//開始導航
- (IBAction)begin:(id)sender {
    
    //創(chuàng)建CLGeocoder對象
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:self.addressText.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        //獲取目的地地理坐標
        CLPlacemark *placemark = [placemarks lastObject];
        //Mapkit框架下的地標
        MKPlacemark *mkPlacemark = [[MKPlacemark alloc] initWithPlacemark:placemark];
        //目的地的item
        MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:mkPlacemark];
        MKMapItem *currentmapItem = [MKMapItem mapItemForCurrentLocation];
        NSMutableDictionary *options = [NSMutableDictionary dictionary];
        //MKLaunchOptionsDirectionsModeDriving:導航類型設(shè)置為駕車模式
        options[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;
        //設(shè)置地圖顯示類型為衛(wèi)星模式
        options[MKLaunchOptionsMapTypeKey] = @(MKMapTypeHybrid);
        options[MKLaunchOptionsShowsTrafficKey] =@(YES);
        //打開蘋果地圖應用
        [MKMapItem openMapsWithItems:@[currentmapItem,mapItem] launchOptions:options];
    }];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

效果如下

導航.gif

以上Demo下載路徑:https://github.com/chengaojian

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倒淫,一起剝皮案震驚了整個濱河市伙菊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昌简,老刑警劉巖占业,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纯赎,居然都是意外死亡谦疾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門犬金,熙熙樓的掌柜王于貴愁眉苦臉地迎上來念恍,“玉大人六剥,你說我怎么就攤上這事》寤铮” “怎么了疗疟?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞳氓。 經(jīng)常有香客問我策彤,道長,這世上最難降的妖魔是什么匣摘? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任店诗,我火速辦了婚禮,結(jié)果婚禮上音榜,老公的妹妹穿的比我還像新娘庞瘸。我一直安慰自己,他們只是感情好赠叼,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布擦囊。 她就那樣靜靜地躺著,像睡著了一般嘴办。 火紅的嫁衣襯著肌膚如雪瞬场。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天户辞,我揣著相機與錄音泌类,去河邊找鬼癞谒。 笑死底燎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的弹砚。 我是一名探鬼主播双仍,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桌吃!你這毒婦竟也來了朱沃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤茅诱,失蹤者是張志新(化名)和其女友劉穎逗物,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑟俭,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翎卓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摆寄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片失暴。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡坯门,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逗扒,到底是詐尸還是另有隱情古戴,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布矩肩,位于F島的核電站现恼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏黍檩。R本人自食惡果不足惜述暂,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望建炫。 院中可真熱鬧畦韭,春花似錦、人聲如沸肛跌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衍慎。三九已至转唉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稳捆,已是汗流浹背赠法。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乔夯,地道東北人砖织。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像末荐,于是被迫代替她去往敵國和親侧纯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容