PhotosPicker、PhotosPickerItem 和 PhotosPickerSelectionBehavior 是 SwiftUI 框架中用于处理照片选择的组件(iOS 16+),它们简化了从用户相册中选择图片或视频的流程。以下是它们的详细说明:
1. PhotosPicker #
- 用途:一个 SwiftUI 视图控件,允许用户从相册中选择单个或多个图片/视频。
- 核心功能:
- 支持单选或多选(通过
selectionBehavior
配置)。 - 可过滤媒体类型(如只允许选择图片)。
- 直接集成到 SwiftUI 的声明式语法中,无需 UIKit 的复杂代理模式。
- 支持单选或多选(通过
- 常用参数:
selection
: 绑定用户选择的PhotosPickerItem
(单个)或[PhotosPickerItem]
(多个)。matching
: 指定媒体类型(如.images
、.videos
)。selectionBehavior
: 控制选择行为(如.continuous
允许多选)。
// 示例:选择单张图片
@State private var selectedItem: PhotosPickerItem?
PhotosPicker(
selection: $selectedItem,
matching: .images,
label: { Label("选择图片", systemImage: "photo") }
)
2. PhotosPickerItem #
- 用途:表示用户选择的单个媒体项目(图片或视频),用于后续数据处理。
- 核心功能:
- 通过异步方法加载媒体数据(如
loadTransferable(type:)
)。 - 支持多种数据类型(
UIImage
、Data
、URL
等)。
- 通过异步方法加载媒体数据(如
// 示例:加载选中的图片
if let selectedItem {
selectedItem.loadTransferable(type: Image.self) { result in
switch result {
case .success(let image):
// 更新 UI 显示 image
case .failure(let error):
print("加载失败: \(error)")
}
}
}
3. PhotosPickerSelectionBehavior #
- 用途:控制用户选择媒体时的交互行为。
- 可选值:
.default
:默认行为(单次选择,选择后自动关闭 Picker)。.continuous
:允许多选,用户可连续选择多个项目,需手动关闭 Picker。
- 示例:
// 允许多选 PhotosPicker( selection: $selectedItems, matching: .images, selectionBehavior: .continuous, label: { Text("选择多张图片") } )
完整示例:多选图片 #
import SwiftUI
import PhotosUI
struct ContentView: View {
@State private var selectedItems: [PhotosPickerItem] = []
@State private var images: [Image] = []
var body: some View {
VStack {
PhotosPicker(
selection: $selectedItems,
matching: .images,
selectionBehavior: .continuous,
label: { Text("选择图片") }
)
ScrollView {
ForEach(0..<images.count, id: \.self) { index in
images[index]
.resizable()
.scaledToFit()
}
}
}
.onChange(of: selectedItems) { _ in
Task {
images.removeAll()
for item in selectedItems {
if let image = try? await item.loadTransferable(type: Image.self) {
images.append(image)
}
}
}
}
}
}
关键注意事项 #
- 权限:需在
Info.plist
中添加NSPhotoLibraryUsageDescription
描述。 - 异步加载:
PhotosPickerItem
的数据加载是异步的,需使用async/await
或completionHandler
。 - 性能:多选大量图片时,建议使用缩略图或分页加载。
这些组件大幅简化了照片选择功能的实现,适合需要快速集成相册功能的 SwiftUI 应用。