対象:
Swift

Map Viewで地図を表示する(Swift)

地図を利用するアプリを考えているなら、Map Viewが最初の選択肢となるだろう。MapViewを使うだけならInterface Builderでそれを貼り付けるだけで良い。しかし、ただ貼り付けただけだとMap Viewのサイズは固定なので見栄えが悪い。Map Viewを画面いっぱいに表示するためには一工夫必要になる。

各端末でMap Viewが画面いっぱいに表示されるようにするには、Size InspectorのAutoresizingを設定するだけで良い。もちろん、画面の回転にも対応してくれる。


iOSのバージョンによっては、以下のようなエラーがコンソールに表示されてMap Viewが表示されないことがあるかも知れない。

'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named MKMapView'

その場合は、ターゲットのCapabilitiesペインでMapsをONにするか、もしくはViewController.swiftの冒頭でimport MapKitするときっと解決するだろう。

更に、このMap View上に現在地を表示したいなら、Attributes InspectorでUser Locationプロパティにチェックを入れる。


尚、iOS 8以降は位置情報の利用にはユーザから許可を得る必要がある。これをやらないと以下のようなメッセージをコンソールで見ることになるだろう。

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

このため、CLLocationManagerのインスタンスを取得してrequestAlwaysAuthorizationを呼び出す等しなければならない。iOSのバージョンによって必要なことは異なるため、詳しくはこちらを参照していただきたい。

iOS 11でUser Locationをtrueにして自分の位置を表示するために必要なコードとInfo.plistの追加項目は以下である。

import UIKit
// CapabilitiesでMapsをONにするかMapKitをimportするかする
//import MapKit
import CoreLocation

class ViewController: UIViewController {

    var locationManager: CLLocationManager!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        locationManager = CLLocationManager()
        // NSLocationAlwaysAndWhenInUseUsageDescriptionに設定したメッセージでユーザに確認
        locationManager.requestAlwaysAuthorization()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
    NSLocationAlwaysAndWhenInUseUsageDescription
    I will always need your location
    NSLocationWhenInUseUsageDescription
    I will need your location when app in use

作成したアプリを実行すると、以下のようになる。白枠の青丸がGPSで得られた現在地だ。


(2017/12/25)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2019 モバイル開発系(K) All rights reserved.
[Home]