【swift】カメラロール(フォトライブラリ)から画像を取得【簡単】

iOSアプリ開発

「カメラロールから選択した画像を取得して表示する処理」を実装しました。思った以上に簡単だったのでメモ。

下準備

Info.plistに追加

カメラロールにアクセスするためには、Info.plistに下記を追加する必要があります。どうやらios10か11くらいから追加必須になったそうですね。

Privacy - Photo Library Usage Description

↑Keyです。そのままコピーしてもいいですし選択肢から選んでもいいですし、とりあえずInformation Property Listの直下に追加してください。Value値のところには、アラートに表示する文章をかきましょう。(「カメラロールにアクセスしますか?」など。空白でもOK。)

2つのデリゲートを追加

カメラロールを呼び出すために、2つのデリゲートを追加します。

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

}

「UIImagePickerControllerDelegate」(画像を選択したときに通知するデリゲート)と「UINavigationControllerDelegate」(わからん)の2つです。

実装

カメラロール呼び出し

カメラロールの呼び出しはシンプル。以下の2行のみです。

let picker = UIImagePickerController()
present(picker, animated: true)

写真選択時・キャンセルボタン押下時

写真選択・キャンセルはカメラロール側の処理。てことで「カメラロールで写真を選んだよ!」という情報をカメラロール側から通知するために、デリゲートをしておかなければいけません。

picker.delegate = self

present(生成)する前に追加してくださいネ。

デリゲートできたら、2つのメソッドを追加します。

extension TextController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
// 画像選択時の処理
// ↓選んだ画像を取得
let images = info[UIImagePickerControllerOriginalImage] as? UIImage
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
// キャンセルボタンを押下時の処理
}
}

閉じる

カメラロールは、自動では閉じてくれません。

閉じたいタイミングで下記を記入しましょう。

picker.dismiss(animated: true, completion: nil)

応用

複数の画像を選択する

複数選択ですが、なんと標準では対応していないので外部ライブラリを使う必要があるとのこと!w

有名どころとしては、こちらのライブラリ。
GitHub - zhangao0086/DKImagePickerController: Image Picker Controller for iOS written in Swift 3.2 & 4.

ソースコードは下記。「import DKImagePickerController」を忘れないでね。

let pickerController = DKImagePickerController()
pickerController.didSelectAssets = { (assets: [DKAsset]) in

for asset in assets{
asset.fetchOriginalImageWithCompleteBlock({ (image, info) in
print(image)
})
}

}

self.present(pickerController, animated: true) {}

いろんなトラブル

Privacy - Photo Library Usage Descriptionを追加していないとエラー

Info.plist に「Privacy - Photo Library Usage Description」を追加しないとエラーになるぞ!

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
Category
9WEB