この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep37】タイマーアプリを作ってみた(UIKit、AudioToolboxフレームワーク)」
タイマーアプリも順調に終わり、次はマップアプリ。
はたして俺が今後アプリを作るにあたってマップを組み込むことは無いかもしれないが、勉強のためだと思って作成することとする。
今回使用するフレームワーク
今回UIKitフレームワークとMapKitフレームワークを使用する。
厳密に言えばCoreLocationフレームワークも使うのだが、それはMapKitフレームワークに含まれているので「import MapKit」と記述してやるだけで使用可能となる。
なにやら前回のタイマーアプリに比べると一気に難しくなったような気がする。
複雑なメソッドや関数が山のように出てくるので挫折しそうになるが、「へ~こんなのがあるんだ~」くらいに思って先に進むのが、習得のコツなのかなって思ってる。
てことでやっていこう。
マップビューの配置からレイアウト、アウトレット接続
この辺はボタン設置と同じ要領でやればいいから前回までを理解すれば簡単にできるはず。
レイアウト–画面いっぱいに余白を0に設定。marginも設定できるがこれも設定しない。
アウトレット接続に関しては最初エラーが出るので、先ほども言った「import MapKit」の記述も忘れないようにする。
CoreLocationフレームワークを使った現在地の取得
ここからが難易度アップ。
現在地を取得するためにユーザに許可を求めるのだが、その文言を指定する。
その後の流れは、ユーザー許可の状態をまずはチェック→許可をリクエストする、と言った感じ。
許可の状態をチェックっていうのはauthorizationStatus()というメソッドで行う。
例えばあるユーザーはどんな時もどんなアプリにも常に許可しているなら、その後の処理をすんなりできる。
しかしもし許可されていない状態だったら、その許可をリクエストして承諾してもらう必要がある。
許可をリクエストするメソッドがrequestWhenInUseAuthorization()だ。
さらにその許可のリクエストに対してOKなのかダメなのかの返答を受けるためにCLLocationManagerDelegateというプロトコルを使うのだ。
ViewControllerに実装するので「manage.delegate = self」と言ったような自らを指定するように記述をすることになる。
許可ステータスが更新された時に呼び出されるメソッド
もし現在地の取得に対して「だめ!」っていってたのが「OK!」に変更されたときにはその変更を伝えなくてはいけない。
それをCLLocationManagerDelegateプロトコルに定義されているlocationManager(_:didChangeAutorization:)メソッドを使う。
これは定義の頭にoptionalが付いているため必ずしも定義する必要はない。
受け取った許可を確認して処理へと進む
ユーザーが現在地の取得を許可した場合、つまり「authorizedWhenInUse」の場合、requestLocationメソッドが発動する。
これは現在地の取得を一度だけ行う事が出来る。
これでう取得した現在地情報はlocationManager(_:didUpddateLocations:)メソッドにて受け取ることができる。
取得に失敗した場合
一応取得に失敗した時に呼び出されるメソッドも用意されている。
locationManager(_:didFailWithEror:)メソッドだ。
これは「こんなのあるんだ」くらいに思っていればいい。
取得した情報とマップビューを組み合わせて地図を表示する
さあ、最終段階。
配列として取得した現在地データをcurrentに代入。
MKCoordinateRegionインスタンス生成をしてマップビューへどの地図を表示させるかという情報を渡す。
具体的に言うと
MKCoordinateRegionMakeWithDistance(_:_:_:)関数を使って「位置情報を元にしたMKCoordinateRegionインスタンスを生成」するのだ。
ここでは「特定したCLLocationのcoordinateプロパティをそのまま渡す」という意味があまりわからないが、まあいい。
最後にMKMapViewクラスのsetRegion(_:animated:)でマップに現在位置を表示させる。
ここまでかなり駆け足で進んできたが、Xcodeの文字変換?文字予測?を使えばコードもミスなく記述できるし時間もそんなにかからないのではないだろうか。
最後に作ったアプリを実際に動作させてみる。
完成したアプリを動かしてみる
iOSシュミレータで実行することはできるんだが、位置情報の取得に関してはリアリティがないので実機で動作の確認をするのがベターである。
がしかし、俺は実機を持っていないのでここはiOSシュミレータでやることとする。
本には実機で動作確認する方法が書いてある。
かなり省略されているから実際に自分でやってみてどうなるか確認してみてほしい。
コメント