PhotoKit — PhotosPicker
This article is extracted from the chat log with AI. Please identify it with caution.

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:))。
    • 支持多种数据类型(UIImageDataURL 等)。
// 示例:加载选中的图片
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)
                    }
                }
            }
        }
    }
}

关键注意事项 #

  1. 权限:需在 Info.plist 中添加 NSPhotoLibraryUsageDescription 描述。
  2. 异步加载PhotosPickerItem 的数据加载是异步的,需使用 async/awaitcompletionHandler
  3. 性能:多选大量图片时,建议使用缩略图或分页加载。

这些组件大幅简化了照片选择功能的实现,适合需要快速集成相册功能的 SwiftUI 应用。

本文共 885 字,创建于 May 18, 2025
相关标签: Xcode, ByAI, SwiftUI