環境設定
權限
開啟地圖本身不需要權限,如果若需要GPS位置,請在info.plist中開啟
StoryBoard & IBOutlet
在StoryBoard上地圖套件名稱叫做Map Kit View
如果想要拉IBOutlet到自己的class中,會發現出現Error,這是因為Map class並不包含在UIKit當中。
所以請import Mapkit
MKMapViewDelegate
最後就是記得設定mapView的delegate
如果需要特殊效果的時候非常有用,例如:開始讀取map位置的時候要做什麼,結束讀取位置的時候要做什麼…
將地址解析為GPS
可以利用CLGeocoder這個class來達成,以下是一個簡單的範例
- 初始化CLGeocoder
- 使用geocodeAddressString此方法,傳入兩個參數
- 需解析之address (字串)
- 解析完後的動作(closure),參數如下
- [CLPlacemark]?: 一個地址有多個可能符合之GPS位置,所以是一個Array。
- Error?: 若無則為nil
- 在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位置,再開始進行標註。
- 初始化MKPointAnnotation
- 設定title / subtitle / image等等欄位
- 設定GPS位置
- 使用方法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到某個地點附近,就必須使用這個功能。
- 初始化座標,需要使用到經緯度。
- 初始化想顯示範圍,MKCoordinateSpanMake的兩個參數分別代表經緯度長度。
- 用上述兩個參數初始化MKCoordinateRegion
- 使用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 位置改變時定位