프로그래밍

SwiftUI / PhotosPicker Example Code

열정 엔지니어 2024. 4. 11. 11:01
//
//  PhotoPickerBootcamp.swift
//  SwiftUIStudy
//
//  Created by 김재원 on 4/11/24.
//

import PhotosUI
import SwiftUI

@MainActor
final class PhotoPickerViewModel: ObservableObject {
    @Published private(set) var selectedImage: UIImage? = nil
    @Published var imageSelection: PhotosPickerItem? = nil {
        didSet {
            setImage(from: imageSelection)
        }
    }

    @Published private(set) var selectedImages: [UIImage] = []
    @Published var imageSelections: [PhotosPickerItem] = [] {
        didSet {
            setImages(from: imageSelections)
        }
    }

    private func setImage(from selection: PhotosPickerItem?) {
        guard let selection else { return }
        Task {
            if let data = try? await selection.loadTransferable(type: Data.self) {
                if let uiimage = UIImage(data: data) {
                    selectedImage = uiimage
                    return
                }
            }
        }
    }

    private func setImages(from selections: [PhotosPickerItem]) {
        Task {
            var uiimages: [UIImage] = []
            for selection in selections {
                if let data = try? await selection.loadTransferable(type: Data.self) {
                    if let uiimage = UIImage(data: data) {
                        uiimages.append(uiimage)
                    }
                }
            }
            selectedImages = uiimages
        }
    }
}

struct PhotoPickerBootcamp: View {
    @StateObject private var viewModel = PhotoPickerViewModel()

    var body: some View {
        VStack(spacing: 40) {
            Text("Photo Picker bootcamp")
            if let image = viewModel.selectedImage {
                Image(uiImage: image)
                    .resizable()
                    .scaledToFill()
                    .frame(width: 200, height: 200)
                    .cornerRadius(10)
            }

            PhotosPicker(selection: $viewModel.imageSelection) {
                Text("Open the photo picker!")
                    .foregroundColor(.red)
            }

            if !viewModel.imageSelections.isEmpty {
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack {
                        ForEach(viewModel.selectedImages, id: \.self) { image in
                            Image(uiImage: image)
                                .resizable()
                                .scaledToFill()
                                .frame(width: 50, height: 50)
                                .cornerRadius(10)
                        }
                    }
                }
            }

            PhotosPicker(selection: $viewModel.imageSelections) {
                Text("Open the photo picker!")
                    .foregroundColor(.red)
            }
        }
    }
}

#Preview {
    PhotoPickerBootcamp()
}
반응형