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

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

[平屋真吾,クラスメソッド株式会社]

カスタムの注釈ビュー「PhotoAnnotationView」を作成する

PhotoAnnotationView.swiftファイルを追加する

 プロジェクトにPhotoAnnotationView.swiftファイルを追加しましょう。ファイルの追加手順はPhotoAnnotation.swiftファイルを追加した手順と同様です。

 クラスのオプションについて以下のように入力します。PhotoAnnotationViewはMKAnnotationViewのサブクラスとして作成します。

図7 オプション選択画面

 「PhotoAnnotationView.swift」ファイルがプロジェクトに追加されました。MapKitをimportしていないのでエラーが出ていますがこれは後ほど修正します。

図8 「PhotoAnnotationView.swift」ファイル追加後の[ナビゲータエリア]

PhotoAnnotationViewクラスを実装する

 実装する内容は以下の通りです。PhotoAnnotationクラスと同様に順に説明していきます。

  1. import文(2行目)
  2. sizeプロパティ(5〜7行目)
  3. thumbnailImage、thumbnailImageViewプロパティ(9〜15行目)
  4. イニシャライザー(引数:annotation、reuseIdentifier)(17〜29行目)
  5. イニシャライザー(引数:frame、引数:coder)(31〜37行目)
  6. prepareForReuseメソッド(39〜41行目)
import UIKit
import MapKit
 
class PhotoAnnotationView: MKAnnotationView {
    class var size :CGSize {
        return CGSize(width: 44.0, height: 44.0)
    }
    
    var thumbnailImage: UIImage? {
        didSet {
            self.thumbnailImageView.image = self.thumbnailImage
        }
    }
    
    private let thumbnailImageView: UIImageView!
    
    override init(annotation: MKAnnotation!, reuseIdentifier: String!) {
        super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
        
        self.frame = CGRect(origin: self.frame.origin, size: PhotoAnnotationView.size)
        
        self.canShowCallout = true
        self.rightCalloutAccessoryView = UIButton.buttonWithType(.DetailDisclosure) as UIView
        
        self.thumbnailImageView = UIImageView(frame: CGRect(origin: CGPointZero, size: PhotoAnnotationView.size))
        self.thumbnailImageView.contentMode = .ScaleAspectFill
        self.thumbnailImageView.clipsToBounds = true
        self.addSubview(self.thumbnailImageView)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init(coder: NSCoder) {
        super.init(coder: coder)
    }
    
    override func prepareForReuse() {
        self.thumbnailImage = nil
    }
}
  • import文(2行目)

 MapKitフレームワークをimportする記述を追加します。

  • タイププロパティ(5〜7行目)

 sizeプロパティは「タイププロパティ」として定義しています。タイププロパティはクラスそのものに定義するプロパティです。タイププロパティとしてクラスにプロパティを追加するには、プロパティ定義の「var」の前に「class」を追加します。

 sizeプロパティは、(どのインスタンスであるかにかかわらず)固定のサムネイルサイズを提供するようにしたいので、タイププロパティとして定義しています。

privateなプロパティの追加定義(9〜15行目)

 MKAnnotationView自体にもimageプロパティが定義されていますが、今回は新たに「thumbnailImage」というプロパティを追加して使用します。

 thumbnailImageプロパティはnilの場合があり得るのでUIImage?型にしています。

 thumbnailImageViewプロパティはクラスの内部からしか使用せず、一度初期値を入れた後は再代入しないので「private」と「let」を指定しています。プロパティやメソッドに「private」を指定することで、同じファイルからのみアクセスを許可できます。

 また、thumbnailImageViewプロパティは初期化が失敗しない限りnilにならないのでUIImageView!型にしています。

  • イニシャライザーをオーバーライド(17〜29行目)

 引数が「annotation」「reuseIdentifier」のイニシャライザーはMKAnnotationViewクラスで定義されているものをオーバーライドして使用するので「override」を指定しています。

 18行目でスーパークラスの同名のイニシャライザーを呼び出し、20行目で自分自身のサイズを指定のサイズに変更しています。

 22〜23行目は注釈ビューをタップしたときに注釈ビューから引き出される形で表示される「吹き出し」に関する設定です。

 また、25〜28行目ではUIImageViewの初期化と初期設定を行っています。

  • 実装が必須のイニシャライザー(引数:frame、引数:coder)(31〜37行目)

 直接使用するわけではありませんが、実装が必須なので追加しています。

  • メソッドのオーバーライド(39〜41行目)

 注釈ビューはMapViewによって管理され、必要に応じて使い回されます。「prepareForReuse」メソッドは再利用される前に呼ばれるので、thumbnailImageの値をnilにしています。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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