Swift MapViewに現在地点を配置する


MapView property

User Locationにチェックを入れる。これにチェックを入れると現在地が取得が出来た時に自動で現在地に青丸のannotationが表示される。

f:id:letitride:20190819232119p:plain


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)
}