首先需要在項(xiàng)目中導(dǎo)入MapKit
#import <MapKit/MapKit.h>
界面如下
01.png
獲取'終點(diǎn)位置'
02.png
獲取 ‘起點(diǎn)位置’, 進(jìn)入MKMapItem.h文件可以看到有一個(gè)類方法(mapItemForCurrentLocation)直接獲取用戶當(dāng)前位置, 注: 模擬器當(dāng)中無法獲取真實(shí)地址的, 需要在模擬器菜單點(diǎn)擊Debug -> Location -> Custom Location設(shè)置
03.png
設(shè)置'起點(diǎn)位置'和'終點(diǎn)位置', launchOptions參數(shù)先設(shè)置nil, 調(diào)用系統(tǒng)自帶的 地圖app 進(jìn)行導(dǎo)航,
04.png
此時(shí)運(yùn)行程序, 需要手動(dòng)點(diǎn)擊'目的地'才會(huì)去規(guī)劃路線
05.png
再次進(jìn)入MKMapItem.h文件, 可以看到iOS10新增了一個(gè)導(dǎo)航模式:
MKLaunchOptionsDirectionsModeDefault
06.png
設(shè)置launchOptions
07.png
再次運(yùn)行程序, 輸入'目的地', 點(diǎn)擊'開始導(dǎo)航', 系統(tǒng)調(diào)用自帶地圖時(shí)就會(huì)會(huì)選擇最優(yōu)路線
08.png
源碼
- (IBAction)navigateClick:(id)sender {
/**
地圖導(dǎo)航的實(shí)現(xiàn)思路:
需要知道起點(diǎn)和終點(diǎn)位置
終點(diǎn)位置的獲取 --> 地理編碼
起點(diǎn)位置的獲取 --> MKMapItem 有一個(gè)類方法可以直接獲取用戶當(dāng)前位置
*/
// 1. 創(chuàng)建地理編碼對(duì)象
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 2. 實(shí)現(xiàn)地理編碼方法
[geocoder geocodeAddressString:self.addressTF.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
// 3. 獲取最后一個(gè)地標(biāo)對(duì)象 --> 創(chuàng)建MKPlacemark對(duì)象
MKPlacemark *mkPlacemark = [[MKPlacemark alloc] initWithPlacemark:placemarks.lastObject];
// 4. 根據(jù)MKPlacemark對(duì)象來創(chuàng)建目的地所在的MKMapItem對(duì)象
MKMapItem *destinationItem = [[MKMapItem alloc] initWithPlacemark:mkPlacemark];
// 5. 獲取起點(diǎn)位置
MKMapItem *sourceItem = [MKMapItem mapItemForCurrentLocation];
// 6. 調(diào)用open方法, 打開系統(tǒng)自帶地圖進(jìn)行導(dǎo)航
// MKMapItem: 表示地圖上的一個(gè)點(diǎn)的對(duì)象
NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDefault};
[MKMapItem openMapsWithItems:@[sourceItem, destinationItem] launchOptions:launchOptions];
}];
}