OptionalなどSwiftとObjective-Cの違いを意識してPhotos Frameworkを使うiPhone 6/6 Plusアプリ開発入門(4)(1/3 ページ)

iPhone 6/6 PlusアプリをSwift言語で作成してみたいという初心者向けにiOS 8の新機能を使ったアプリの作り方を一から解説する入門連載。今回は、前回の記事で追加した写真の情報を「Photos Framework」の機能を使用して取り出し、写真の情報にひも付いた座標にピンを表示します。また、その過程でOptionalなどSwiftとObjective-Cの違いについて解説します。

» 2015年03月03日 17時40分 公開
[平屋真吾クラスメソッド株式会社]
「iPhone 6/6 Plusアプリ開発入門」のインデックス

連載目次

写真の情報にひも付いた座標にピンを表示する

 前回の「Swiftでの変数の定義、Xcodeでのアウトレット接続、iOSシミュレーターへの画像素材追加」では、Swiftでの変数定義について解説し、MapView上へピンの追加と画像素材の追加を行いました。

前回の図11 iOSシミュレーター(iPhone 4S)の実行結果(左:写真アプリのPhotosタブ、右:写真アプリの詳細画面)

 今回は前回の記事で追加した写真の情報を「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)
}
前回のviewDidLoadメソッド

 今後、さらにコードを追加していくので、5〜12行目の処理のひとまとまりを別のメソッドに分けてしまいましょう。

Swiftのメソッドの基本形

 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)
}
prepareMapViewメソッド

viewDidLoadメソッドからprepareMapViewメソッドを呼び出す

 以下のようにviewDidLoadメソッドを修正して「prepareMapView」メソッドを呼び出すようにしましょう。

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
 
    self.prepareMapView()
}

フォトライブラリへのアクセス許可を求めるコードを追加する

 いよいよ「Photos Framework」の機能を使い始めます。

import文の追加

 「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」メソッド

 「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」の型が型推論で決まるため、このような記述が可能になっています。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。