iPhone 6/6 PlusアプリをSwift言語で作成してみたいという初心者向けにiOS 8の新機能を使ったアプリの作り方を一から解説する入門連載。今回は、前回の記事で追加した写真の情報を「Photos Framework」の機能を使用して取り出し、写真の情報にひも付いた座標にピンを表示します。また、その過程でOptionalなどSwiftとObjective-Cの違いについて解説します。
前回の「Swiftでの変数の定義、Xcodeでのアウトレット接続、iOSシミュレーターへの画像素材追加」では、Swiftでの変数定義について解説し、MapView上へピンの追加と画像素材の追加を行いました。
今回は前回の記事で追加した写真の情報を「Photos Framework」の機能を使用して取り出し、写真の情報にひも付いた座標にピンを表示します。
今回も、前回に引き続き「ViewController.swift」ファイルにコードを追加していきます。
前回の記事で「ViewController.swift」ファイルの「viewDidLoad」メソッド内にMapViewの設定に関するコードを追加しました。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.mapView.rotateEnabled = false self.mapView.pitchEnabled = false let centerCoordinate = CLLocationCoordinate2D(latitude: 35.681382, longitude: 139.766084) let initialSpan = MKCoordinateSpan(latitudeDelta: 0.4, longitudeDelta: 0.4) let initialRegion = MKCoordinateRegion(center: centerCoordinate, span: initialSpan) self.mapView.setRegion(initialRegion, animated: true) }
今後、さらにコードを追加していくので、5〜12行目の処理のひとまとまりを別のメソッドに分けてしまいましょう。
Swiftのメソッドの基本形は以下のようになります。
func メソッド名 (仮引数: 型) -> 戻り値の型 { // 処理 }
MapViewの初期設定を行う5〜12行目の処理を「prepareMapView」メソッドとして「ViewController.swift」ファイルの「didReceiveMemoryWarning」メソッドの次の行に追加しましょう。
今回追加するメソッドは引数・戻り値ともに“なし”なので、「func prepareMapView()」という記述が可能です。また、このメソッドはviewController.swift内からしか使用しないので、アクセス修飾子「private」を指定しています。
private func prepareMapView() { self.mapView.rotateEnabled = false self.mapView.pitchEnabled = false let centerCoordinate = CLLocationCoordinate2D(latitude: 35.681382, longitude: 139.766084) let initialSpan = MKCoordinateSpan(latitudeDelta: 0.4, longitudeDelta: 0.4) let initialRegion = MKCoordinateRegion(center: centerCoordinate, span: initialSpan) self.mapView.setRegion(initialRegion, animated: true) }
以下のようにviewDidLoadメソッドを修正して「prepareMapView」メソッドを呼び出すようにしましょう。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.prepareMapView() }
いよいよ「Photos Framework」の機能を使い始めます。
「ViewController.swift」ファイルの先頭の「import MapKit」の次の行に「import Photos」という1行を追加します。
import UIKit import MapKit import Photos // 追加
先ほど作成した「prepareMapView」メソッドに加えて二つのメソッドを追加します。
「checkAuthorizationStatus」メソッド内では、フォトライブラリへのアクセス許可をチェックし、未許可であれば許可を求める処理を行います。フォトライブラリへのアクセスが許可されていないとアルバムや写真の情報を取得できませんので、真っ先にチェック処理を行います。
「prepareAnnotations」メソッドはMapViewに注釈オブジェクトを追加するメソッドです。実装内容は後ほど説明します。
private func checkAuthorizationStatus() { let status = PHPhotoLibrary.authorizationStatus() switch status { case .Authorized: self.prepareAnnotations() default: PHPhotoLibrary.requestAuthorization{ status in if status == .Authorized { self.prepareAnnotations() } } } } private func prepareAnnotations() { // 処理 }
また、以下のようにviewDidLoadメソッド修正して「checkAuthorizationStatus」メソッドを呼び出すようにしておきます。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.prepareMapView() self.checkAuthorizationStatus() }
「checkAuthorizationStatus」メソッド内のコードを見ていきましょう。
「PHPhotoLibrary」クラスの「authorizationStatus」メソッドを使用すると、「PHAuthorizationStatus」型の値を取得できます。
「PHAuthorizationStatus」型の各値の内容は以下の通りです。
ステータス | 内容 |
---|---|
NotDetermined | アプリに与える権限をユーザーはまだ選択していない |
Restricted | フォトライブラリへのアクセスが許可されていない(ペアレンタルコントロールなど) |
Denied | フォトライブラリへのアクセスをユーザーが明示的に拒否している |
Authorized | フォトライブラリへのアクセスをユーザーが許可している |
また、「PHAuthorizationStatus」型の定義は以下のようになっています。
enum PHAuthorizationStatus : Int { case NotDetermined case Restricted case Denied case Authorized }
switch文内のcase文では「case .Authorized:」と記述していますが、これは「case PHAuthorizationStatus.Authorized:」という記述の簡略表記です。定数「status」の型が型推論で決まるため、このような記述が可能になっています。
Copyright © ITmedia, Inc. All Rights Reserved.