8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iOSAdvent Calendar 2021

Day 12

iPhoneのフォトライブラリから複数写真を選択【PHPickerViewController】

Last updated at Posted at 2021-12-11

2020リリースのPHPickerViewController。

#UIImagePickerControllerとなにがちがうか

複数枚取得
アルバムへのアクセス
検索機能
プライバシー許可がいらない

アプリでフォトライブラリーの全ての写真を取得するのではなく、
シェアピッカーからユーザーが選んだ写真だけをアプリに渡します。


【複数枚選択】

###PHPickerの設定と表示

PhotosUIをインポートし、使用するクラスにPHPickerViewControllerDelegateを継承させます。

import PhotosUI

class ViewController: UIViewController,PHPickerViewControllerDelegate {
...

PHPickerの設定をして表示します。

var configuration = PHPickerConfiguration()
configuration.selectionLimit = 36 // 選択上限。0にすると無制限に。
configuration.filter = .images // 取得できるメディアの種類。

// configuration.filter = .any([.videos,livePhotos]) // 複数種類メディア

let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
present(picker, animated: true)

###メディアの取得

Delegateメソッドでメディアを取得できます。
メディアはitemProviderの配列で返されます。
itemProviderは、canLoadObjectメソッドで目的のメディアのクラスを取得できるか確認でき、
loadObjectメソッドでメディアデータを取得できます。

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    picker.dismiss(animated: true)
    // 1枚目の写真
    if let firstItemProvider = results.first?.itemProvider {
        if firstItemProvider.canLoadObject(ofClass: UIImage.self) {
            firstItemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error  in
                if let firstImage = image as? UIImage,  let safeSelf = self {
                    DispatchQueue.main.async {
                        safeSelf.firstImageView.image = firstImage
                    }
                }
            }
        }
    }
        
    // 2枚目の写真    
    if results.count > 1 {
        let secondItemProvider = results[1].itemProvider
        if secondItemProvider.canLoadObject(ofClass: UIImage.self) {
            secondItemProvider.loadObject(ofClass: UIImage.self) { [weak self]  image, error in
                if let secondImage = image as? UIImage,  let safeSelf = self {
                    DispatchQueue.main.async {
                        safeSelf.secondImageView.image = secondImage
                    }
                }
            }
        }
    }
}

【アルバムへのアクセス】 【検索】

🐣


フリーランスエンジニアです。
お仕事のご相談こちらまで
簡単な開発内容をお書き添えの上、お気軽にご連絡ください。
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。

Twitter
Medium

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?