MapView property
User Locationにチェックを入れる。これにチェックを入れると現在地が取得が出来た時に自動で現在地に青丸のannotationが表示される。
info.plist
位置取得に対するPrivacyを定義する。
Privacy - Location When In Use Usage Description
:位置情報を元に地図の中心を移動します
などとすれば良い。
setup
import CoreLocation import MapKit class MapViewController: UIViewController { let locationManager = CLLocationManager() let mapView = MKMapView() self.view.addSubView(mapView) override func viewDidLoad() { super.viewDidLoad() } }
位置取得の許諾 & 位置情報の更新
取得から3秒後に取得をストップするようにした。
func requestCurrentLocation(){ //位置情報サービスの確認 if CLLocationManager.locationServicesEnabled(){ let status = CLLocationManager.authorizationStatus() if status == CLAuthorizationStatus.notDetermined{ locationManager.requestWhenInUseAuthorization() } self.locationManager.startUpdatingLocation() DispatchQueue.global().asyncAfter(deadline: .now()+2) { self.locationManager.stopUpdatingLocation() } } }
viewDidLoad
setUserTrackingMode
で現在地点に地図を移動できる。
override func viewDidLoad() { super.viewDidLoad() //位置取得 self.requestCurrentLocation() mapView.setUserTrackingMode(MKUserTrackingMode.follow, animated: false) }
地図の縮尺を定義したい場合、以下のパラメータを調整すればよい。
var region:MKCoordinateRegion = mapView.region region.span.latitudeDelta = 0.02 region.span.longitudeDelta = 0.02 mapView.setRegion(region,animated:true)
MapView viewFor annotationを定義している場合
MapViewのdelegateメソッド、viewFor annotationを定義している場合、地図上に青点のannotationを打つ処理がオーバライドされてしまう。
青点のannotationのみ、処理しないという記述を行うと期待した挙動になる。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { if annotation.title == "My Location"{ return nil } //従来の処理 let pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: nil) }
リンク
リンク