59 lines
1.9 KiB
Swift
59 lines
1.9 KiB
Swift
import SwiftUI
|
|
import PhotosUI
|
|
|
|
struct ImagePicker: UIViewControllerRepresentable {
|
|
@Binding var images: [UIImage]
|
|
var selectionLimit: Int
|
|
var onDismiss: (() -> Void)?
|
|
|
|
func makeUIViewController(context: Context) -> PHPickerViewController {
|
|
var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
|
|
configuration.filter = .images
|
|
configuration.selectionLimit = selectionLimit
|
|
|
|
let picker = PHPickerViewController(configuration: configuration)
|
|
picker.delegate = context.coordinator
|
|
return picker
|
|
}
|
|
|
|
func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {}
|
|
|
|
func makeCoordinator() -> Coordinator {
|
|
Coordinator(self)
|
|
}
|
|
|
|
class Coordinator: NSObject, PHPickerViewControllerDelegate {
|
|
let parent: ImagePicker
|
|
|
|
init(_ parent: ImagePicker) {
|
|
self.parent = parent
|
|
}
|
|
|
|
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
|
|
let group = DispatchGroup()
|
|
var newImages: [UIImage] = []
|
|
|
|
for result in results {
|
|
group.enter()
|
|
|
|
if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
|
|
result.itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
|
|
if let image = image as? UIImage {
|
|
newImages.append(image)
|
|
}
|
|
group.leave()
|
|
}
|
|
} else {
|
|
group.leave()
|
|
}
|
|
}
|
|
|
|
group.notify(queue: .main) {
|
|
self.parent.images = newImages
|
|
self.parent.onDismiss?()
|
|
picker.dismiss(animated: true)
|
|
}
|
|
}
|
|
}
|
|
}
|