簡単な地図をMapViewで表示するコード
こっちで書いてたやつからの発展。
目標はこんな感じ
- 一回だけ自分の位置を取得する
- 取得した位置情報を元に地図を表示
そしてできあがったソースがこちら。
ViewController.swift
var locationManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
if (locationManager != NSNull()) {
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()
let status = CLLocationManager.authorizationStatus()
switch status{
case .Restricted, .Denied:
break
case .NotDetermined:
// iOS8での位置情報追跡リクエストの方法
if ((locationManager?.respondsToSelector("requestWhenInUseAuthorization")) != nil){
locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager?.requestWhenInUseAuthorization()
locationManager?.startUpdatingLocation()
}else{
locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager?.startUpdatingLocation()
}
case .AuthorizedWhenInUse, .AuthorizedAlways:
// 従来の位置情報追跡リクエストの方法
locationManager?.startUpdatingLocation()
default:
break
}
}
}
override func viewWillAppear(animated: Bool) {
locationManager?.startUpdatingLocation()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
let latitude = newLocation.coordinate.latitude
let longitude = newLocation.coordinate.longitude
let location = CLLocationCoordinate2DMake(latitude,longitude)
mkMapView.setCenterCoordinate(location, animated: true)
var region: MKCoordinateRegion = mkMapView.region
region.center = location
region.span.latitudeDelta = 0.02
region.span.longitudeDelta = 0.02
let pointAnnotation: MKPointAnnotation = MKPointAnnotation()
pointAnnotation.coordinate = location
pointAnnotation.title = "現在地"
mkMapView.addAnnotation(pointAnnotation)
mkMapView.setRegion(region, animated: true)
//地図の形式
mkMapView.mapType = MKMapType.Standard
locationManager?.stopUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
}
このままだと男料理すぎるので、少し細かく刻んでいきます。
位置情報取得認証
// 位置情報取得確認のメッセージを表示。必須。
locationManager?.requestAlwaysAuthorization()
let status = CLLocationManager.authorizationStatus()
// 位置情報取得の認証状態で分岐
switch status{
case .Restricted, .Denied:
break
case .NotDetermined:
if ((locationManager?.respondsToSelector("requestWhenInUseAuthorization")) != nil){
// iOS8ではinfo.plistに"requestWhenInUseAuthorization"か、"requestAlwaysAuthorization"を記載しないといけない
// requestWhenInUseAuthorization:起動中のみ使用、requestAlwaysAuthorization:いつでも使用できる。
// 精度の指定
locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager?.requestWhenInUseAuthorization()
// 位置情報取得の開始
locationManager?.startUpdatingLocation()
}else{
locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager?.startUpdatingLocation()
}
case .AuthorizedWhenInUse, .AuthorizedAlways:
// 従来の位置情報追跡リクエストの方法
locationManager?.startUpdatingLocation()
default:
break
}
この部分のコードで、位置情報取得のためのAuthorizationと位置情報の取得開始ができる。
そして、以下の部分が位置情報取得開始後の処理にあたる。
// 位置情報を取得したときに呼ばれる。Androidでのコールバックかも。
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
// 取得した位置情報の緯度経度
let latitude = newLocation.coordinate.latitude
let longitude = newLocation.coordinate.longitude
let location = CLLocationCoordinate2DMake(latitude,longitude)
// 表示するマップの中心を、取得した位置情報のポイントに指定
mkMapView.setCenterCoordinate(location, animated: true)
// 表示する領域を設定する
var region: MKCoordinateRegion = mkMapView.region
// 領域設定の中心
region.center = location
// 表示する領域の拡大・縮小の係数
region.span.latitudeDelta = 0.02
region.span.longitudeDelta = 0.02
// ピンのオブジェクトを生成
let pointAnnotation: MKPointAnnotation = MKPointAnnotation()
// ピンの位置を取得した位置情報の位置に設定
pointAnnotation.coordinate = location
// ピンをタップした際に表示される吹き出しの内容
pointAnnotation.title = "現在地"
// 設定したピンをマップ上に反映
mkMapView.addAnnotation(pointAnnotation)
// 決定した表示設定をMapViewに適用
mkMapView.setRegion(region, animated: true)
// 地図の形式。Standardがデフォルトの地図。Satteliteが航空地図。
mkMapView.mapType = MKMapType.Standard
// 位置情報は既に取得したので、これ以降取得を行わないように位置情報取得を停止
locationManager?.stopUpdatingLocation()
}
// 位置情報取得が失敗した際に呼ばれる。
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
}
とりあえずこんな形。自分の位置にピンを立てるとかを忘れたので、次はそれを追加したりする予定。