iOS 16以降で導入されたPhotosPickerは、SwiftUIアプリで写真選択機能を簡単に実装できるコンポーネントです。
本記事では、基本的な使い方から実践的な活用方法まで解説していきます。
PhotosPickerとは?
PhotosPickerは、PhotosUIフレームワークの構造体(struct) です。
SwiftUIでユーザーの写真ライブラリから画像や動画を選択する機能を提供するViewコンポーネントで、iOS 16以降で利用可能です。
PhotosPickerは写真ライブラリとの連携機能を提供するため、SwiftUI単体には含まれておらず、専用のPhotosUI
フレームワークをインポートする必要があります。
このフレームワークはiOS標準なので、追加のライブラリインストールは不要です。
主な機能
- 写真ライブラリからの画像・動画選択: ユーザーの写真ライブラリから任意のメディアファイルを選択
- 複数選択対応: 一度に複数の画像を選択する機能
- メディアタイプの制限: 画像のみ、動画のみなど、選択可能なファイル形式を制限
- システム標準UI: iOSのシステム標準ピッカーUIを自動で提供
- プライバシー保護: 必要な写真のみアクセス可能で、プライバシーに配慮
主要な引数、プロパティやメソッドは?
PhotosPickerには様々な設定オプションが用意されており、アプリの要件に応じてカスタマイズできます。
基本的な引数
引数 | 型 | 説明 |
---|---|---|
selection |
Binding<PhotosPickerItem?> |
選択されたアイテムをバインドする変数 |
maxSelectionCount |
Int? |
最大選択数(nilの場合は無制限) |
selectionBehavior |
PhotosPickerSelectionBehavior |
選択時の動作設定 |
matching |
PHPickerFilter? |
選択可能なメディアタイプの指定 |
preferredItemEncoding |
PhotosPickerItem.EncodingDisambiguationPolicy |
エンコーディング設定 |
サンプルコード例
基本的な使用例
最もシンプルなPhotosPicker の実装例です。
1枚の画像を選択して表示する基本的なパターンを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import SwiftUI import PhotosUI struct ContentView: View { @State private var selectedItem: PhotosPickerItem? @State private var selectedImage: Image? var body: some View { VStack { PhotosPicker("写真を選択", selection: $selectedItem) if let selectedImage { selectedImage .resizable() .scaledToFit() .frame(width: 300, height: 300) } } .onChange(of: selectedItem) { oldValue, newValue in Task { if let loaded = try? await newValue?.loadTransferable(type: Image.self) { selectedImage = loaded } } } } } |
このコードでは、onChange
修飾子を使って選択されたアイテムの変更を監視し、非同期で画像データを読み込んでいます。
複数選択の例
複数の画像を同時に選択する場合の実装例です。
SNSアプリの投稿機能などで活用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
struct MultipleSelectionView: View { @State private var selectedItems: [PhotosPickerItem] = [] @State private var selectedImages: [Image] = [] var body: some View { VStack { PhotosPicker("写真を選択(最大3枚)", selection: $selectedItems, maxSelectionCount: 3, matching: .images) ScrollView { LazyVGrid(columns: Array(repeating: GridItem(), count: 2)) { ForEach(selectedImages.indices, id: \.self) { index in selectedImages[index] .resizable() .scaledToFit() .frame(height: 150) } } } } .onChange(of: selectedItems) { oldValue, newValue in selectedImages.removeAll() for item in newValue { Task { if let loaded = try? await item.loadTransferable(type: Image.self) { selectedImages.append(loaded) } } } } } } |
上記コードでは、配列で複数のアイテムを管理し、maxSelectionCount
で選択可能な最大枚数を制限しています。
LazyVGrid
を使用してグリッド表示を実現しています。
メディアタイプを制限した例
特定の種類のメディアのみを選択可能にする場合の実装例です。
用途に応じてフィルターを設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
struct FilteredPickerView: View { @State private var selectedItem: PhotosPickerItem? var body: some View { VStack { // 画像のみ選択可能 PhotosPicker("画像を選択", selection: $selectedItem, matching: .images) // 動画のみ選択可能 PhotosPicker("動画を選択", selection: $selectedItem, matching: .videos) // 画像と動画の両方 PhotosPicker("メディアを選択", selection: $selectedItem, matching: .any(of: [.images, .videos])) } } } |
matching
パラメータを使用することで、ユーザーが選択できるメディアタイプを事前に制限できます。
これにより、アプリの仕様に適さないファイルの選択を防げます。
活用シーン
PhotosPickerは様々なシーンで活用できる汎用性の高いコンポーネントです。
プロフィール画像の設定
ユーザーがアバターやプロフィール画像を設定する際に使用。
1枚の画像選択で十分なケースが多いです。
1 2 3 4 |
PhotosPicker("プロフィール画像を変更", selection: $profileImage, matching: .images) |
SNSアプリの投稿機能
InstagramやTwitterのような投稿機能で、複数の画像を同時に選択して投稿する機能に最適です。
1 2 3 4 5 |
PhotosPicker("写真を追加", selection: $postImages, maxSelectionCount: 10, matching: .images) |
画像編集アプリ
写真編集アプリで編集する素材画像を選択する際に便利です。
ドキュメント作成アプリ
メモアプリやドキュメント作成アプリで、テキストに画像を挿入する機能として活用できます。
商品登録・ECアプリ
フリマアプリや商品管理アプリで、商品画像を登録する際の画像選択機能として利用できます。
PhotosPickerの利点
PhotosPickerを使うメリットとしては下記が挙げられます。
- 実装の簡単さ: わずか数行のコードで高機能なピッカーを実装
- 一貫したUX: iOS標準のUIなので、ユーザーにとって馴染みやすい
- プライバシー配慮: 必要な写真のみアクセス、全ライブラリへのアクセス許可不要
- パフォーマンス: システムレベルで最適化された処理
- 将来性: Appleの標準コンポーネントなので、OSアップデートに追随
従来のUIImagePickerControllerと比較して、デリゲートメソッドの実装やUIKitとSwiftUIの橋渡し処理が不要になるため、開発効率が大幅に向上します。
また、iOS標準のプライバシー保護機能が自動的に適用され、ユーザーから信頼されるアプリ開発に貢献します。
使用時の注意点
PhotosPickerを使用する際は下記の点に注意しましょう。
- iOS 16以降限定: それ以前のバージョンでは
@available
での分岐が必要 - 非同期処理: 画像の読み込みは非同期で行う必要がある
- メモリ管理: 大量の画像を扱う際はメモリ使用量に注意
PhotosPickerは比較的新しいAPIのため、古いiOSバージョンをサポートする場合は代替手段も用意する必要があります。
また、画像の読み込みはawait
を使った非同期処理になるため、適切なエラーハンドリングとユーザーフィードバック(ローディング表示など)の実装が重要です。
大容量の画像や動画を扱う際は、メモリリークを防ぐため不要になったデータの適切な解放も考慮しましょう。
まとめ
PhotosPickerは、SwiftUIアプリで写真選択機能を実装する際の標準的な選択肢です。
従来のUIImagePickerControllerと比較して簡潔なコードで実装でき、iOS標準のUIを提供してくれます。
画像を扱うアプリを開発する際は、まずPhotosPicker の使用を検討しましょう!