MapKit教程:如何在Swift中將地圖添加到iOS應(yīng)用程序

將地圖添加到iOS應(yīng)用程序是一個廣泛傳播的功能认然。地圖使移動應(yīng)用更具互動性妓布,并極大地改善了用戶體驗堡掏。在這個MapKit教程中,我們描述了使用MapKit的經(jīng)驗吕座,以幫助您學習如何在Swift中將地圖添加到您的iOS應(yīng)用程序虐译。

1.簡介

您是否曾想在手機應(yīng)用程序中構(gòu)建地圖?這項任務(wù)似乎太難了嗎吴趴?如果是這樣漆诽,那么這篇文章適合你。今天锣枝,我們將討論MapKit厢拭。

那么,MapKit究竟是什么惊橱?它是一個基于Apple Maps的數(shù)據(jù)和API構(gòu)建的有用框架蚪腐,可幫助iOS開發(fā)人員在iPhone應(yīng)用程序中輕松顯示地圖。

我們需要注意的MapKit最重要的特性是MKMapView類 - UIView的子類税朴。此類具有所需的所有功能回季,例如地圖家制,衛(wèi)星甚至當前位置∨菀唬可以在屏幕上使用手勢來改變地理區(qū)域颤殴。真是太棒了吧?鼻忠!但這還不是全部涵但。

我們還可以在地圖上添加注釋照片帖蔓,標題和標記特定位置矮瘟。另一個好處是我們可以通過MKMapViewDelegate協(xié)議接收通知,例如更改用戶的當前位置或地圖的區(qū)域塑娇。今天澈侠,我們將學習如何做到這一點。現(xiàn)在埋酬,讓我們開始使用這個廣泛的MapKit教程哨啃。

2.權(quán)限和當前位置

通常,我們會為您準備一個入門項目写妥。但是談?wù)撍⒉欢嗳颍晕覀儗嶋H上會從頭到尾編寫代碼。希望這將是讀者追隨的另一個激勵因素珍特。

第1步:將Map Kit視圖從庫拖到屏幕祝峻。

通過使用Interface Builder,將Map Kit View對象拖到故事板上次坡。為簡單起見呼猪,您可以將其固定在屏幕的邊緣(或安全區(qū)域(如果您參考此處))(當然,通過使用自動布局約束)砸琅。

第2步:在View Controller中創(chuàng)建一個管理MapKitView的IBOutlet

接下來我們需要做的是將IBOutlet連接從屏幕上的Map Kit視圖拖到UIViewController。不要忘記導入MapKit庫轴踱,以便代碼成功編譯症脂。

BOOM,它看起來很棒淫僻,對吧诱篷?MapKit為我們提供了地圖,現(xiàn)在我們需要做的就是觀察和處理不同的事件雳灵,例如更改當前位置或地區(qū)等棕所。

然而,在完成所有這些之前悯辙,我們首先需要做一件重要的事情:我們必須獲得訪問用戶位置的權(quán)限琳省。當然迎吵,如果你不這樣做,你的應(yīng)用程序仍然有效针贬,地圖仍然正常顯示击费。但您必須這樣做,因為位置信息是屬于用戶的私人信息之一桦他。我們必須在獲得之前詢問他們的權(quán)限蔫巩。如果您未能首先獲得權(quán)限,則可能會導致應(yīng)用程序崩潰快压。

Info.plist文件中圆仔,我們添加了一個像這樣的新項:

在描述部分中,您必須向用戶解釋您需要其權(quán)限的原因蔫劣。我們的“用于你的目的”(讓我們試著說一些說服他們接受的東西)荧缘。

第3步:檢查位置服務(wù)。

首先拦宣,我們將創(chuàng)建一個名為locationManager的變量

let locationManager = CLLocationManager() 

然后截粗,在viewDidLoad()中,我們有:

if CLLocationManager.locationServicesEnabled(){ //繼續(xù)在這里實施 } else { //做一些讓用戶知道為什么需要打開它的東西鸵隧。 } 

locationServicesEnabled功能用于檢查用戶是否已接通他們的位置服務(wù)或不(在所示設(shè)置在iPhone)绸罗。如果有,我們可以繼續(xù)實施我們的代碼豆瘫。否則珊蟀,我們需要做一些事情讓用戶知道他們?yōu)槭裁葱枰蜷_它(比如發(fā)送彈出窗口來通知用戶)。

第4步:檢查位置授權(quán)狀態(tài)

為此外驱,我們將創(chuàng)建一個函數(shù)育灸,例如:

func checkAuthorizationStatus(){ switch CLLocationManager.authorizationStatus(){ 
case.authorizedWhenInUse:break 
case.denied:break 
case .notDetermined:break 
case .restricted:break 
case.authorizedAlways:break
     }
 } 

我們創(chuàng)建了一個名為checkAuthorizationStatus()的函數(shù),基本上它將檢查授權(quán)狀態(tài)是什么昵宇。我們需要處理五種情況:

  • authorizedWhenInUse:應(yīng)用程序被授權(quán)獲取用戶位置的唯一時間是應(yīng)用程序打開時磅崭。
  • authorizedAlways:這意味著應(yīng)用程序可以隨時在后臺獲取您的位置。這是地圖應(yīng)用程序瓦哎,這個應(yīng)用程序總是需要你的位置砸喻,當你在某個地方獲得方向或你走動。
  • notDetermined:第一次彈出顯示時蒋譬,他們沒有選擇允許或不允許割岛,所以這取決于你需要相應(yīng)處理的項目。

對于剩下的兩個案例犯助,您需要根據(jù)具體情況向用戶發(fā)送通知癣漆,例如用戶未授予顯示其位置的權(quán)限。在本文中剂买,我們不會關(guān)注這些情況惠爽,但是癌蓖,當您處理實際項目時,您還需要處理這些情況疆股。它們和前兩個一樣重要

在本文中费坊,出于教育目的,我們只處理第一種情況(authorizedWhenInUse)旬痹。所以附井,繼續(xù) - 我們將編寫這行Swift代碼:

mapView.showsUserLocation = true

此代碼將顯示用戶的當前位置×讲校總之永毅,所有代碼行如下所示:</pre>

override func viewDidLoad(){ 
super.viewDidLoad() 
checkLocationServices() 
} 
func checkLocationServices(){
 if CLLocationManager.locationServicesEnabled(){ checkLocationAuthorization()
 } else { 
//顯示警告,讓用戶知道他們必須打開它人弓。
 }} 
func checkLocationAuthorization(){ 
switch CLLocationManager.authorizationStatus(){ 
case.authorizedWhenInUse: 
mapView.showsUserLocation = true 
case .denied://顯示警告告訴用戶如何打開權(quán)限 break case .notDetermined: locationManager.requestWhenInUseAuthorization() 
mapView.showsUserLocation = true 
case .restricted://顯示警告沼死,讓他們知道發(fā)生了什么 break case.authorizedAlways: break
 }
 }

現(xiàn)在,讓我們構(gòu)建并再次運行Xcode項目崔赌。BOOM意蛀,它顯示了當前的位置。請記住健芭,您可以模擬iOS模擬器中的任何位置县钥。

所以,你現(xiàn)在怎么想慈迈?這真的很酷若贮,對吧?痒留!只需少量代碼就可以獲得很多功能谴麦。但是,這甚至都不是全部伸头。在下一節(jié)中匾效,我們將向您展示MapKit的一個有趣功能,我們相信您會非常喜歡它熊锭。那是在地圖上顯示任意位置列表弧轧。完全理解MapKit教程后,您將能夠構(gòu)建自己的Store Locator應(yīng)用程序碗殷。

3.在地圖上顯示地點列表

讓我們構(gòu)建一個功能,在地圖上顯示體育場列表速缨。以下是我們?nèi)绾卧赟wift中快速實現(xiàn)這一目標锌妻。

第1步:創(chuàng)建Model對象

讓我們?yōu)?strong>體育場創(chuàng)建一個模型對象。

struct Stadium { 
var name:String 
var lattitude:CLLocationDegrees 
var longtitude:CLLocationDegrees 
}

接下來旬牲,讓我們在viewDidLoad()中創(chuàng)建一個英格蘭體育場的硬編碼列表仿粹。這些是我們想要在地圖上繪制的體育場:
</pre>

let stadiums = [Stadium(name: “Emirates Stadium”, lattitude: 51.5549, longtitude: -0.108436),
Stadium(name: “Stamford Bridge”, lattitude: 51.4816, longtitude: -0.191034),
Stadium(name: “White Hart Lane”, lattitude: 51.6033, longtitude: -0.065684),
Stadium(name: “Olympic Stadium”, lattitude: 51.5383, longtitude: -0.016587),
Stadium(name: “Old Trafford”, lattitude: 53.4631, longtitude: -2.29139),
Stadium(name: “Anfield”, lattitude: 53.4308, longtitude: -2.96096)]

第2步:將體育場添加到地圖中搁吓。

這在Swift中非常容易。MapKit可以在地圖上添加地點吭历,例如微風:

func fetchStadiumsOnMap(_ stadiums: [Stadium]) {
  for stadium in stadiums {
    let annotations = MKPointAnnotation()
    annotations.title = stadium.name
    annotations.coordinate = CLLocationCoordinate2D(latitude: 
      stadium.lattitude, longitude: stadium.longtitude)
    mapView.addAnnotation(annotations)
  }
}

它看起來很簡單堕仔,對吧?對于列表中的每個體育場晌区,我們創(chuàng)建了一個MKPointAnnotation實例摩骨。該MKPointAnnotation類可以幫助我們創(chuàng)建綁在地圖上指定點的對象。接下來朗若,我們將體育場的名稱和坐標分配給該對象恼五。之后,我們將其添加到地圖視圖中哭懈。

完成所有操作后灾馒,我們在viewDidLoad中調(diào)用此函數(shù),其中包含已創(chuàng)建的體育場列表遣总。讓我們運行并構(gòu)建Xcode項目:

override func viewDidLoad() {
  super.viewDidLoad()
  checkLocationServices()
  fetchStadiumsOnMap(stadiums)
}

作為旁注睬罗,例如,如果您的地方離英格蘭很遠旭斥,則無法在手機上看到這些地方容达。因此,您需要放大地圖琉预,然后滑到英格蘭董饰。然后你會看到像這樣的精確點:

4.總結(jié)

本文基本上指導您如何創(chuàng)建地圖,詢問用戶訪問其位置的權(quán)限圆米,并使用MKMapView顯示當前的地理位置卒暂。它還向您展示了如何在地圖上提取地點列表。

我們希望通過本文娄帖,您現(xiàn)在有信心創(chuàng)建一個簡單的地圖也祠,并將更多功能集成到您的移動應(yīng)用程序中。我們希望你會喜歡這篇文章近速。這是完整的Swift源代碼诈嘿。請分享這篇文章,以幫助我們通過這個非常棒的MapKit教程吸引更多開發(fā)人員削葱〗毖牵快樂的編碼!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末析砸,一起剝皮案震驚了整個濱河市昔字,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌首繁,老刑警劉巖作郭,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陨囊,死亡現(xiàn)場離奇詭異,居然都是意外死亡夹攒,警方通過查閱死者的電腦和手機蜘醋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咏尝,“玉大人压语,你說我怎么就攤上這事∽赐粒” “怎么了无蜂?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒙谓。 經(jīng)常有香客問我斥季,道長,這世上最難降的妖魔是什么累驮? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任酣倾,我火速辦了婚禮,結(jié)果婚禮上谤专,老公的妹妹穿的比我還像新娘躁锡。我一直安慰自己,他們只是感情好置侍,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布映之。 她就那樣靜靜地躺著,像睡著了一般蜡坊。 火紅的嫁衣襯著肌膚如雪杠输。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天秕衙,我揣著相機與錄音蠢甲,去河邊找鬼。 笑死据忘,一個胖子當著我的面吹牛鹦牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勇吊,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼曼追,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汉规?” 一聲冷哼從身側(cè)響起拉鹃,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲫忍,沒想到半個月后膏燕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡悟民,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年坝辫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片射亏。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡近忙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出智润,到底是詐尸還是另有隱情及舍,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布窟绷,位于F島的核電站锯玛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兼蜈。R本人自食惡果不足惜攘残,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望为狸。 院中可真熱鬧歼郭,春花似錦、人聲如沸辐棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漾根。三九已至泰涂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間立叛,已是汗流浹背负敏。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秘蛇,地道東北人其做。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像赁还,于是被迫代替她去往敵國和親妖泄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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