How to open the ImagePicker in SwiftUI?

后端 未结 8 1286
生来不讨喜
生来不讨喜 2020-11-29 23:53

I need to open the ImagePicker in my app using SwiftUI, how can I do that?

I thought about using the UIImagePickerController, but I don\'t know how to do that in Swi

8条回答
  •  迷失自我
    2020-11-30 00:33

    iOS 14 Xcode 12 - Photo Picker SwiftUI with Reusable View with limits allowed

    struct ImagePickerView: UIViewControllerRepresentable {
        
        @Binding var images: [UIImage]
        @Binding var showPicker: Bool
        var selectionLimit: Int
        
        func makeUIViewController(context: Context) -> some UIViewController {
            var config = PHPickerConfiguration()
            config.filter = .images
            config.selectionLimit = selectionLimit
            let picker = PHPickerViewController(configuration: config)
            picker.delegate = context.coordinator
            return picker
        }
        
        func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
        
        func makeCoordinator() -> Coordinator {
            Coordinator(parent: self)
        }
        
        class Coordinator: NSObject, PHPickerViewControllerDelegate {
    
            var parent: ImagePickerView
            
            init(parent: ImagePickerView) {
                self.parent = parent
            }
            
            func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
                
                parent.showPicker.toggle()
                
                for img in results {
                    if img.itemProvider.canLoadObject(ofClass: UIImage.self) {
                        img.itemProvider.loadObject(ofClass: UIImage.self) { (image, err) in
                            guard let image1 = image else { return }
                            
                            DispatchQueue.main.async {
                                self.parent.images.append(image1 as! UIImage)
                            }
                        }
                    } else {
                        // Handle Error
                        parent.showPicker.toggle()
                    }
                }
            }
        }
    }
    

    then in View you can do

    VStack {          
        Image(systemName: "camera.viewfinder")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .onTapGesture {
                self.viewModel.pickerBool.toggle()
            }
    }
    .sheet(isPresented: self.$viewModel.pickerBool) {
        ImagePickerView(images: self.$viewModel.images, showPicker: self.$viewModel.pickerBool, selectionLimit: 3)
    }
    

提交回复
热议问题