開発メモ

開発関係のメモをいろいろと。たぶん。

UIImagePickerControllerを使ってみた

iPhone / iPadで、単純に画像を一枚取得するだけであればUIImagePickerControllerを使うのが便利です。

そこでいろいろ調べたのですが、最近のSwiftで書かれた良い感じの例が見つからなかったので、自分で作ってみました。

ソースコードはこちら。
(このページで紹介しているコードのブランチはv1.0です)

See_Ku / ImagePickerDemo — Bitbucket
https://bitbucket.org/See_Ku/imagepickerdemo

動作を確認した環境

環境 情報
Xcode 7.2.1 (7C1002)
iOS 9.2
Swift 2.1.1
Date 2016/3/5

ポイント解説

1. 使える機能を確認

画像を選ぶ前に、そもそも、その機能が使えるのかを確認する必要があります。具体的にはこんな感じになります。

// カメラは使えるか?
if UIImagePickerController.isSourceTypeAvailable(.Camera) == false {
    cameraButton.enabled = false
}

この場合、カメラ機能が使えるかを調べて、使えないときは対応するボタンを無効にしています。今のところ、カメラ以外はどんな環境でも使えるような気がしますが、念のために他の機能を使うときもチェックするのが良いでしょう。たぶん。

2. メディアタイプを確認

本来ならそれぞれの機能でどんなメディアタイプが使えるかを調べないといけません。 (availableMediaTypesForSourceType(_:) を使います)

が、画像はどの機能でも確実に取れるようなので、ここではチェックを省いています。いけませんね。

3. UIImagePickerControllerを作成&画面遷移

UIImagePickerControllerを作成し、必要な情報を設定して画面を遷移させます。具体的にはこんな感じ。

/// Cameraから画像を取得
@IBAction func onCamera(sender: AnyObject) {

    // ImagePickerを作成
    let ipc = UIImagePickerController()
    ipc.delegate = self
    ipc.sourceType = .Camera
    ipc.allowsEditing = true

    // Cameraは全画面で選択
    presentViewController(ipc, animated: true, completion: nil)
}

ポイントとしては、 カメラの場合は全画面で、それ以外の時はモーダルフォーム で使用する必要があります。厳密に言うとカメラをモーダルフォームで使う事も出来るようですが、アップル推奨は全画面、と。そういう事のようです。

4. 画像の取得/キャンセルに対応

あとは、画像が正常に取得できたときとキャンセルされたときの処理を書くだけです。

/// 画像を取得できた
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    // 編集後のイメージを取り出し
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
        imageView.image = image
    }

    // ImagePickerを終了
    dismissViewControllerAnimated(true, completion: nil)
}

/// キャンセルされた
func imagePickerControllerDidCancel(picker: UIImagePickerController) {

    // ImagePickerを終了
    dismissViewControllerAnimated(true, completion: nil)
}

わざわざ、辞書からimageを取り出さないといけないのが、ちょっと面倒かもしれません。

情報元

UIImagePickerController Class Reference
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImagePickerController_Class/

履歴

  • 2016/03/05 Deprecatedなメソッドを使っていたのを修正