しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Swift】UIImagePickerControllerでカメラロールから写真を取得

UIImagePickerControllerを使ったカメラロールの操作を試してみました。

ImagePickerの表示

まずはカメラロールの操作の為に、Info.plistにNSPhotoLibraryUsageDescriptionというキーを追加します。
ここにはカメラロールの利用目的を書きます。

f:id:llcc:20170717170608p:plain

ここに書かれた文言が、アクセス許可ポップアップに表示されます。

f:id:llcc:20170717170658p:plain

ImagePicker(画像選択画面)の表示は下の通りです。

import UIKit

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let c = UIImagePickerController()
        present(c, animated: true)
    }
}

アプリを立ち上げると、下のように画像選択画面が表示されます。

f:id:llcc:20170717170908p:plain

ImagePickerは、画像選択時・キャンセルボタン押下時のイベントを取る事ができます。
イベント取得は下のようにUIImagePickerControllerDelegateを使います。

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let c = UIImagePickerController()
        c.delegate = self // 今回追加
        present(c, animated: true)
    }
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        // キャンセルボタンを押された時に呼ばれる
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        // 写真が選択された時に呼ばれる
    }
}

ユーザーがカメラロールへのアクセスを許可しているかどうかは下メソッドで取得できます。

PHPhotoLibrary.requestAuthorization { status in
    switch status {
    case .authorized: print("authorized")
    case .denied: print("denied")
    case .notDetermined: print("NotDetermined")
    case .restricted: print("Restricted")
    }
}

不許可の場合にImagePickerを立ち上げると、下のような表示になります。

f:id:llcc:20170717171732p:plain

画像を取得する

選択画像の取得は、UIImagePickerControllerDelegateのimagePickerController:didFinishPickingMediaWithInfoメソッドで行います。
引数のinfoにUIImageが入っているので、下のように取り出します。

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    }
}

画像の他にも、メディアのタイプとメディアのURLを取得できます。

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        
        let mediaType = info[UIImagePickerControllerMediaType] as? String // → public.image
        let imageUrl = info[UIImagePickerControllerReferenceURL] as? URL // → assets-library://asset/asset.JPG?id=XXXX&ext=JPG
    }
}

UIImagePickerControllerのオプション

デフォルトでは、UIImagePickerControllerは画像しか取得できません。
下のようにmediaTypesを変更することで動画も扱えるようになります。

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let c = UIImagePickerController()
        c.mediaTypes = ["public.image", "public.movie"]
        present(c, animated: true)
    }
}

取扱可能なメディアはavailableMediaTypesメソッドで確認できます。

print(UIImagePickerController.availableMediaTypes(for: .photoLibrary))

UIImagePickerControllerのsourceTypeを.cameraにすればカメラ撮影での画像取得もできます。

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let c = UIImagePickerController()
        c.sourceType = .camera
        present(c, animated: true)
    }
}