環境設定

權限

開啟地圖本身不需要權限,如果若需要GPS位置,請在info.plist中開啟
Alt Text

StoryBoard & IBOutlet

在StoryBoard上地圖套件名稱叫做Map Kit View
如果想要拉IBOutlet到自己的class中,會發現出現Error,這是因為Map class並不包含在UIKit當中。
所以請import Mapkit

1
import Mapkit

MKMapViewDelegate

最後就是記得設定mapView的delegate
如果需要特殊效果的時候非常有用,例如:開始讀取map位置的時候要做什麼,結束讀取位置的時候要做什麼…

將地址解析為GPS

可以利用CLGeocoder這個class來達成,以下是一個簡單的範例

  1. 初始化CLGeocoder
  2. 使用geocodeAddressString此方法,傳入兩個參數
    • 需解析之address (字串)
    • 解析完後的動作(closure),參數如下
    • [CLPlacemark]?: 一個地址有多個可能符合之GPS位置,所以是一個Array。
    • Error?: 若無則為nil
  3. 在closure當中,把經緯度印出來
    • 我們可以從CLPlacemark的location屬性當中,找到經度和緯度。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 初始化
let geoCoder = CLGeocoder()

// 解析字串
geoCoder.geocodeAddressString(address) {
	(places, error) in
  // 如果解析失敗,直接回傳不做任何事
	guard error == nil else {
		print ("Get position error")
		return
	}
	
  // 印出位置
	if(places?.count)! > 0 {
		let placeMark = places?.first
		print("Location: \(placeMark?.location)")
	}

}

標註位置

先拿到要標註的GPS位置,再開始進行標註。

  1. 初始化MKPointAnnotation
  2. 設定title / subtitle / image等等欄位
  3. 設定GPS位置
  4. 使用方法addAnnotation方法將大頭針插在地圖上
1
2
3
4
5
6
7
8
func setAnnotation(placeMark:CLPlacemark){
    // 開始進行標註
    let annotation = MKPointAnnotation()
    annotation.title = "Hello~~"
    annotation.subtitle = "Moto"
    annotation.coordinate = (placeMark.location?.coordinate)!
    self.mapView.addAnnotation(annotation)
}

將畫面拉到特定位置

標註畫面只是將大頭針插上位置,地圖並沒有移動。如果想要將地圖zoom in到某個地點附近,就必須使用這個功能。

  1. 初始化座標,需要使用到經緯度。
  2. 初始化想顯示範圍,MKCoordinateSpanMake的兩個參數分別代表經緯度長度。
  3. 用上述兩個參數初始化MKCoordinateRegion
  4. 使用setRegion方法
1
2
3
4
5
6
7
func zoomInMap(placeMark:CLPlacemark){
		// set region
    let cl2d = CLLocationCoordinate2D(latitude: (placeMark.location?.coordinate.latitude)!, longitude: (placeMark.location?.coordinate.longitude)!)
		let span = MKCoordinateSpanMake(0.075, 0.075)
		let region = MKCoordinateRegion(center: cl2d, span: span)
		self.mapView.setRegion(region, animated: true)
}

以下難產中

MapKit 位置改變時定位