iOS 百度地圖 Demo

效果圖

效果圖

效果圖-新增

一届榄、環(huán)境設(shè)置

1.開發(fā)環(huán)境:Xocode 7.3.1

2.模擬器環(huán)境:iOS 9.3

3.iOS 9 之后不能直接使用 HTTP 進(jìn)行請求浅乔,需要在 Info.plist 新增一段用于控制 ATS 的配置:

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

也即:

ATS配置

[站外圖片上傳中……(4)]

注:
bitcode 是 xcode 7 之后新增的配置選項(xiàng),默認(rèn)為 YES铝条,我們提交程序到 App store 上時靖苇,Xcode 會將程序編譯為一個中間表現(xiàn)形式(bitcode)。然后 App store 會再將這個 bitcode 編譯為可執(zhí)行的 64 位或 32 位程序班缰。

在這個 Demo 里不需要使用 bitcode 功能贤壁,所以設(shè)置為了 NO
[站外圖片上傳中……(5)]

4.導(dǎo)入百度地圖 SDK

百度地圖提供了兩種導(dǎo)入方式埠忘,可以直接把 SDK 拖入到工程脾拆,也可以使用 CocoaPods ,這里我是用后面一種方式導(dǎo)入百度地圖 SDK莹妒。

編輯 Podfile 內(nèi)容如下:

pod 'BaiduMapKit' #百度地圖SDK

在 Podfile 所在的文件夾下輸入命令:

pod install

但是無論是執(zhí)行 pod install 還是 pod update 都卡在了 Analyzing dependencies 不動.

如果之前安裝過 CocoaPods名船,在安裝和更新第三方類庫的時候建議使用下面的語句,這樣不用等太多時間:

pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
pod install --no-repo-update

手動配置.framework形式開發(fā)包

第一步旨怠、根據(jù)需要導(dǎo)入 .framework包

百度地圖 iOS SDK 采用分包的形式提供 .framework包渠驼,請廣大開發(fā)者使用時確保各分包的版本保持一致。其中BaiduMapAPI_Base.framework 為基礎(chǔ)包鉴腻,使用 SDK 任何功能都需導(dǎo)入迷扇,其他分包可按需導(dǎo)入百揭。
將所需的 BaiduMapAPI_XX.framework 拷貝到工程所在文件夾下。
在 TARGETS->Build Phases-> Link Binary With Libaries 中點(diǎn)擊“+”按鈕蜓席,在彈出的窗口中點(diǎn)擊 “Add Other” 按鈕器一,選擇 BaiduMapAPI_XX.framework 添加到工程中。
注: 靜態(tài)庫中采用 Objective-C++ 實(shí)現(xiàn)厨内,因此需要您保證您工程中至少有一個 .mm 后綴的源文件(您可以將任意一個 .m 后綴的文件改名為.mm)祈秕,或者在工程屬性中指定編譯方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As隘庄,并將其設(shè)置為 "Objective-C++"

第二步踢步、引入所需的系統(tǒng)庫

百度地圖SDK中提供了定位功能和動畫效果,v2.0.0版本開始使用OpenGL渲染丑掺,因此您需要在您的 Xcode 工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework述雾、SystemConfiguration.framework街州、CoreGraphics.framework吭露、Security.framework隶校、libsqlite3.0.tbd(xcode7以前為 libsqlite3.0.dylib)、CoreTelephony.framework 涯呻、libstdc++.6.0.9.tbd(xcode7以前為libstdc++.6.0.9.dylib)黍翎。
(注:紅色標(biāo)識的系統(tǒng)庫為v2.9.0新增的系統(tǒng)庫面徽,使用v2.9.0及以上版本的地圖SDK,務(wù)必增加導(dǎo)入這3個系統(tǒng)庫匣掸。)
添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries趟紊,添加這幾個系統(tǒng)庫即可。

第三步碰酝、環(huán)境配置

在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC霎匈。

第四步、引入mapapi.bundle資源文件

如果使用了基礎(chǔ)地圖功能送爸,需要添加該資源铛嘱,否則地圖不能正常顯示 mapapi.bundle 中存儲了定位、默認(rèn)大頭針標(biāo)注View及路線關(guān)鍵點(diǎn)的資源圖片袭厂,還存儲了矢量地圖繪制必需的資源文件墨吓。如果您不需要使用內(nèi)置的圖片顯示功能,則可以刪除 bundle 文件中的 image 文件夾纹磺。您也可以根據(jù)具體需求任意替換或刪除該 bundle 中 image 文件夾的圖片文件帖烘。
方法:選中工程名,在右鍵菜單中選擇 Add Files to “工程名”…爽航,從BaiduMapAPI_Map.framework||Resources 文件中選擇 mapapi.bundle 文件蚓让,并勾選 “Copy items if needed” 復(fù)選框乾忱,單擊 “Add” 按鈕,將資源文件添加到工程中历极。

使用 cocoaPods 導(dǎo)入的百度地圖窄瘟,運(yùn)行之后可能會報錯:
[站外圖片上傳中……(6)]
這時需要進(jìn)入
[站外圖片上傳中……(7)]
將所有的百度地圖 framework 導(dǎo)入到工程中:
[站外圖片上傳中……(8)]
然后再運(yùn)行,錯誤解決趟卸,會出現(xiàn)下面的錯誤:
[站外圖片上傳中……(9)]
這時進(jìn)入 info.plist 添加 Bundle display name蹄葱,如下圖:
[站外圖片上傳中……(10)]
配置百度地圖資源文件:
[站外圖片上傳中……(11)]
[站外圖片上傳中……(12)]
再次運(yùn)行,控制臺會輸出『設(shè)置成功』則說明設(shè)置成功了锄列。
[站外圖片上傳中……(13)]

二图云、代碼

代碼結(jié)構(gòu):

  • Classess
    • 百度地圖&路徑規(guī)劃
    • 覆蓋物
      • YMAnnotationViewController - 自定義標(biāo)注拖動控制器
      • YMAnnotationController - 系統(tǒng)標(biāo)注拖動控制器
    • 主控制器
      • YMTableViewController - 剛進(jìn)入程序的控制器
        • Controller
          • YMMapViewController - 百度地圖控制器
          • YMPoiDetailViewController - 店鋪詳情控制器
          • YMRouteAnnotationController - 路徑規(guī)劃控制器
        • Model
          • YMPoi - 店鋪模型
          • YMPointAnnotation - 標(biāo)注模型
        • View
          • YMAnnotationView - 標(biāo)注視圖
          • YMPaopaoView - 點(diǎn)擊標(biāo)注彈出自定義的泡泡
    • Category
      • UIImage+Rotate - 路徑規(guī)劃界面 image 的擴(kuò)展

注意:

  1. 需要把 AppDelegate.m 改成 AppDelegate.mm 文件
  2. 需要把路徑規(guī)劃控制也寫成 .mm 后綴,即YMRouteAnnotationController.mm邻邮。

新增功能:


2016 年 7 月 5 日

新增兩個控制器竣况,分別是 YMAnnotationViewControllerYMAnnotationController筒严,可以對自定義的標(biāo)注和系統(tǒng)的標(biāo)注進(jìn)行拖動操作丹泉。

百度地圖提供了下面的代理方法:

/**
 *拖動annotation view時,若view的狀態(tài)發(fā)生變化鸭蛙,會調(diào)用此函數(shù)摹恨。ios3.2以后支持
 *@param mapView 地圖View
 *@param view annotation view
 *@param newState 新狀態(tài)
 *@param oldState 舊狀態(tài)
 */
- (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState
   fromOldState:(BMKAnnotationViewDragState)oldState;

但是我進(jìn)行設(shè)置的時候上面的方法并不起作用,可能使用的方式不對...

所以我使用了下面的方法:

/**
 *當(dāng)選中一個annotation views時娶视,調(diào)用此接口
 *@param mapView 地圖View
 *@param views 選中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view;

/**
 *當(dāng)取消選中一個annotation views時晒哄,調(diào)用此接口
 *@param mapView 地圖View
 *@param views 取消選中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;

這樣設(shè)置之后,每次在當(dāng)我點(diǎn)擊的時候大頭針的時候肪获,大頭針處于選中狀態(tài)寝凌,這次設(shè)置大頭針為開始拖動狀態(tài),然后拖動地圖贪磺,取消選中的時候硫兰,設(shè)置大頭針為結(jié)束拖動狀態(tài)。

如下代碼:

/**
 *當(dāng)選中一個annotation views時寒锚,調(diào)用此接口
 *@param mapView 地圖View
 *@param views 選中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view {
    // 當(dāng)選中標(biāo)注的之后劫映,設(shè)置開始拖動狀態(tài)
    view.dragState = BMKAnnotationViewDragStateStarting;
}

/**
 *當(dāng)取消選中一個annotation views時,調(diào)用此接口
 *@param mapView 地圖View
 *@param views 取消選中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)annotationView {
    // 取消選中標(biāo)注后刹前,停止拖動狀態(tài)
    annotationView.dragState = BMKAnnotationViewDragStateEnding;
    // 設(shè)置轉(zhuǎn)換的坐標(biāo)會有一些偏差泳赋,具體可以再調(diào)節(jié)坐標(biāo)的 (x, y) 值
    CGPoint dropPoint = CGPointMake(annotationView.center.x, CGRectGetMaxY(annotationView.frame));
    CLLocationCoordinate2D newCoordinate = [_mapView convertPoint:dropPoint toCoordinateFromView:annotationView.superview];
    [annotationView.annotation setCoordinate:newCoordinate];
    /// geo檢索信息類,獲取當(dāng)前城市數(shù)據(jù)
    BMKReverseGeoCodeOption *reverseGeoCodeOption = [[BMKReverseGeoCodeOption alloc] init];
    reverseGeoCodeOption.reverseGeoPoint = newCoordinate;
    [_geoSearch reverseGeoCode:reverseGeoCodeOption];
}

說明:

1.在 AppDelegate.mm 的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中設(shè)置百度地圖管理者,需要在百度地圖 API 控制臺設(shè)置 AppKey:

NSString *mapKey = @"x5EHcRvWZm8uzkt3HUpGBQU3";
    _mapManager = [[BMKMapManager alloc]init];
    // 如果要關(guān)注網(wǎng)絡(luò)及授權(quán)驗(yàn)證事件喇喉,請設(shè)定generalDelegate參數(shù)
    BOOL ret = [_mapManager start:mapKey generalDelegate:nil];
    if (ret) {
        NSLog(@"設(shè)置成功祖今!");
    }

2.使用 cocoaPods 可能會遇到下面的問題
[站外圖片上傳中……(14)]
解決辦法如下:
[站外圖片上傳中……(15)]

再次運(yùn)行就不會報錯了。

3.說明:地圖上的標(biāo)注抓取的是美團(tuán)的數(shù)據(jù)。

說明:
這只是一個簡單的 demo千诬,寫的比較粗糙耍目,大家可以給我留言,需要完成什么樣的功能徐绑,如果有時間邪驮,我會盡力加上需要的功能,后面我還會繼續(xù)更新傲茄。謝謝大家的支持毅访!如果你覺得我寫的 demo 對你有所幫助,請在 github 上下載的時候順手給個 star盘榨,不勝感激喻粹!

下面是 demo 下載地址:

github 下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市草巡,隨后出現(xiàn)的幾起案子守呜,更是在濱河造成了極大的恐慌,老刑警劉巖捷犹,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弛饭,死亡現(xiàn)場離奇詭異,居然都是意外死亡萍歉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門档桃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枪孩,“玉大人,你說我怎么就攤上這事藻肄∶镂瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵嘹屯,是天一觀的道長攻询。 經(jīng)常有香客問我,道長州弟,這世上最難降的妖魔是什么钧栖? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮婆翔,結(jié)果婚禮上拯杠,老公的妹妹穿的比我還像新娘。我一直安慰自己啃奴,他們只是感情好潭陪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般依溯。 火紅的嫁衣襯著肌膚如雪老厌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天黎炉,我揣著相機(jī)與錄音枝秤,去河邊找鬼。 笑死拜隧,一個胖子當(dāng)著我的面吹牛宿百,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洪添,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼垦页,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了干奢?” 一聲冷哼從身側(cè)響起痊焊,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忿峻,沒想到半個月后薄啥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逛尚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年垄惧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绰寞。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡到逊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滤钱,到底是詐尸還是另有隱情觉壶,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布件缸,位于F島的核電站铜靶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏他炊。R本人自食惡果不足惜争剿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佑稠。 院中可真熱鬧秒梅,春花似錦、人聲如沸舌胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辆它,卻和暖如春誊薄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锰茉。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工呢蔫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飒筑。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓片吊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親协屡。 傳聞我的和親對象是個殘疾皇子俏脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 各位小伙伴們大家好,今天我向大家介紹一下蘋果百度地圖的使用方法肤晓,因?yàn)樽鲞^一些想關(guān)的APP爷贫,感覺百度地圖還是挺方便的...
    Lee0528閱讀 14,659評論 18 46
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件补憾、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • 圖文整理根據(jù)李哲老師之運(yùn)動解剖學(xué)2網(wǎng)課漫萄,vivian整理。 p1 第一章 簡介 腿后肌群柔韌度測試(3個高度) 平...
    舒涵vivian閱讀 624評論 0 4
  • 關(guān)于作者 基思·斯坦諾維奇盈匾,加拿大多倫多大學(xué)人類發(fā)展與應(yīng)用心理學(xué)教授腾务,曾擔(dān)任加拿大應(yīng)用認(rèn)知科學(xué)首席科學(xué)家。2012...
    札記俠閱讀 491評論 0 0