PHPickerViewController初見ガイド
PHPickerViewControllerとは
フォトライブラリからアセットを選択するためのユーザーインターフェイスを提供するビューコントローラーです!
UIImagePickerControllerの代わりに登場したクラスで、安定性と信頼性が向上しました。
また、画像を検索できる機能やアクセス許可なしでカメラロールの画像を取得できます。
PHPickerConfiguration
PHPickerの初期設定部分
PHPickerConfiguration()
var configuration = PHPickerConfiguration()
configuration.filter = .images
configuration.selectionLimit = 1
configuration.preferredAssetRepresentationMode = .current
let picker = PHPickerViewController(configuration: configuration)
filterで取得できるタイプを指定する。
複数の場合は、.any(of: [.images, .livePhotos, .videos])と記述する。
selectionLimitで選択可能数を指定する。
1を指定すると一枚で、0を指定すると無限に選択可能になる。
preferredAssetRepresentationMode
選択された画像の解像度やビデオの品質などを指定するプロパティです。
.currentを指定した場合は、選択されたアセットがデバイスの現在の設定に応じて最適な表現で提供されます。
他に、最適な表現にするautomaticと最も互換性がある表現にするcompatibleがあります。
PHPickerViewController(configuration: configuration)
PHPickerViewControllerを初期化して設定を反映させる。
選択された後の処理
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
dismiss(animated: true)
}
dismiss(animated: true)
親ViewCcontrollerの子Viewを全て閉じる
func picker(PHPickerViewController, didFinishPicking: [PHPickerResult])
この関数は、ユーザーが選択を完了したか、キャンセルボタンを使用してピッカーを解除したことをdelegateに通知します。
PHPickerResult
ユーザーが選択したアセットを表すstructです。
二つのプロパティを持ちます。
var assetIdentifier: String?
選択した資産のローカル識別子。
let itemProvider: NSItemProvider
選択した資産のサポートされている表現。
itemProvider
複数の型をサポートしており、画像、動画、テキスト、ファイルをデータやオブジェクトとして提供します。
同じデータを複数の形式にすることもでき、画像をUIImageのインスタンスとして提供することやURLデータとして提供することもできます。
itemProviderの重要なインスタンスメソッド
canLoadObject
itemProvider.canLoadObject(ofClass: UIImage.self)
アイテムプロバイダーが指定されたクラスのオブジェクトをロードできるかどうかを示すブール値を返す関数もあります。
loadObject
loadObject(ofClass:completionHandler:)
指定されたクラスのオブジェクトをアイテムプロバイダーに非同期にロードし、オブジェクトを返します。
- NSItemProviderは、指定されたクラスのオブジェクトをロードできるかどうかを確認します。
- ロード可能な場合、指定されたクラスのオブジェクトを取得します。
- ロードが完了すると、指定された完了ハンドラーが呼び出されます。このハンドラーには、ロードされたオブジェクトとオプションのエラーが渡されます。
- オブジェクトはオプショナルで返されるので、guardでアンラップ
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
dismiss(animated: true)
if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, _ in
guard let image = image as? UIImage else {
return
}
}
}
}
Discussion