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なメソッドを使っていたのを修正