連載
» 2015年04月07日 05時00分 UPDATE

iPhone 6/6 Plusアプリ開発入門(5):Swiftのカスタムクラスの作り方――プロトコル、サブクラス、イニシャライザー、タイププロパティメソッドのオーバーライド、デリゲートについて注釈の作成で学ぶ (1/4)

iPhone 6/6 PlusアプリをSwift言語で作成してみたいという初心者向けにiOS 8の新機能を使ったアプリの作り方を一から解説する入門連載。今回は、前回の記事で追加した地図上の「注釈」を写真のサムネイルに差し替える課程でSwiftのカスタムクラスの作成手順について解説します。

[平屋真吾,クラスメソッド株式会社]
「iPhone 6/6 Plusアプリ開発入門」のインデックス

連載目次

 前回の記事「OptionalなどSwiftとObjective-Cの違いを意識してPhotos Frameworkを使う」では「Photos Framework」の機能を使用してフォトライブラリから写真情報を取り出し、写真情報にひも付いた座標にピンを表示しました。また、Swiftの特徴の一つである「Optional型」について解説しました。

 図1は前回の記事の時点でのPhotoMapアプリの実行結果です。今回は地図上のピン状の画像を写真のサムネイルに差し替えていきます。

iOS8-4_figure-03.jpg 図1 iOSシミュレーター(iPhone 4s)の実行結果(前回記事の時点)

MapView上のオブジェクトについて整理する

 その前に、MapViewで使用するオブジェクトについて整理してみます。

「注釈」について

 これまでの連載では、地図上の単一の座標に表示するコンテンツのことを「ピン」と記述していましたが、アップル公式のドキュメントである「位置情報とマッププログラミングガイド」に合わせて「注釈」と記述することにします。

 注釈を使用することで、特定の座標位置を目立たせ、その場所に関する情報を提供できます。

 本連載で作成する「PhotoMap」アプリの場合は、「写真の撮影場所」を表示するために注釈を使用します。

注釈を表示するために必要なオブジェクト

 地図に注釈を表示するには、注釈1つに対して「注釈オブジェクト」「注釈ビュー」の2つのオブジェクトが必要です。「データを管理するオブジェクト」と「ビュー」が切り離されていて、オブジェクトを効率よく管理できるようになっています。

項目 内容 標準的なクラス
注釈オブジェクト 注釈のデータを管理するオブジェクト MKPointAnnotation
注釈ビュー 地図上に注釈の可視表現を描画するビュー MKPinAnnotationView

 前回の記事の実装では、MKPointAnnotationおよびMKPinAnnotationViewを使用していましたが、今回の記事では注釈オブジェクト・注釈ビュー共にカスタムクラスを作成します。理由は以下の通りです。

  • 注釈オブジェクトにPHAsset(写真のメタデータを保持するオブジェクト)を持たせたい
  • 注釈ビューをカスタマイズしたい
  • Swiftのカスタムクラスの作成手順について触れておきたい
項目 今回作成するクラス
注釈オブジェクト PhotoAnnotation
注釈ビュー PhotoAnnotationView

カスタムクラスで地図に注釈を追加する大まかな流れ

 カスタムの注釈オブジェクト・注釈ビューを使用して、地図に注釈を追加する大まかな流れは以下の通りです。

  1. 注釈オブジェクトを作成し、MapViewに追加する
  2. 注釈ビューが必要になると、MapViewはそのデリゲートオブジェクトの「mapView:viewForAnnotation:メソッド」を呼び出す(注釈ビューをいつ表示するかは、MapViewが判断する)
  3. 「mapView:viewForAnnotation:メソッド」内に記述した「注釈ビューのセットアップと更新処理」が行われる

 1.は前回記事で「prepareAnnotations」メソッドとして実装した処理です。フォトライブラリから取り出したPHAssetが保持する位置情報を使用して、MKPointAnnotationをMapViewに追加しました。

private func prepareAnnotations() {
    let fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: nil)
    fetchResult?.enumerateObjectsUsingBlock ({result, index, stop in
        
        if let asset = result as? PHAsset {
            if let location = asset.location {
                let annotation = MKPointAnnotation()
                annotation.coordinate = location.coordinate
                self.mapView.addAnnotation(annotation)
            }
        }
    })
}
前回のprepareAnnotationsメソッド

 今回はカスタムの注釈ビューを使用して注釈の可視表現を実現するので、さらに「2.」と「3.」の処理が必要です。

 とはいえ、今回必要なことはViewContorollerクラスに「mapView:viewForAnnotation:メソッド」を追加し、「注釈ビューのセットアップと更新処理」を記述することだけですので比較的簡単です。

Swiftのカスタムクラスの作成

 カスタムクラスを作る場合は、.swiftファイルを追加してクラスを定義します。すでにあるクラスのサブクラスとして定義することもできますし、プロトコルを使って「特定の用途に合ったクラス」を定義することもできます。

 クラスには主に、プロパティ、イニシャライザー、メソッドが必要となります。最初にimport文を使う場合が多くなります。

 「イニシャライザー」はクラスを「初期化」するためのメソッドで「init」という名前になります。

 以降、PhotoAnnotationとPhotoAnnotationViewを具体例として解説します。

       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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