有没有办法让 SwiftUI 中的 PhotosPicker 使用相机代替?

Swi*_*low 6 uikit swift swiftui photosui

有没有办法让 SwiftUI 中的 PhotosUI PhotosPicker 直接从相机获取照片?我正在尝试更改应用程序中的 PhotosPickers 以使用相机,而不是强制用户从图像库中选择图像。有没有办法像使用 ImagePicker 一样指定 PhotosPicker 图像的来源?

我在网上搜索了很多关于 PhotoPicker 的文章,但没有一个示例有让它使用相机的方法。我应该硬着头皮将所有内容切换到图像选择器,还是有办法让 PhotoPicker 使用相机?

谢谢。

小智 1

步骤 1:创建一个对话框来选择照片相机的选项

步骤 2:为图像选择器创建操作表

struct BaseView: View {
     @State var showSelection: Bool = false
     @State var showPicker: Bool = false
     @State var type: UIImagePickerController.SourceType = .photoLibrary

      var body: some View {

            Zstack {
                YourView()
            }
            .confirmationDialog(Lables.selectImage,
                            isPresented: $showSelection,
                            titleVisibility: .hidden) {
            
            Button(ButtonName.camera) {
                showPicker = true
                type = .camera
            }
            
            Button(ButtonName.photos) {
                showPicker = true
                type = .photoLibrary
             
            }
        }
        .fullScreenCover(isPresented: $showPicker) {
            ImagePickerView(sourceType: profileImageVM.pickerType) { image in
                 // image your image
            }
        }

      }
}
Run Code Online (Sandbox Code Playgroud)

第 3 步:创建图像选择器

struct ImagePickerView: UIViewControllerRepresentable {
    
    private var sourceType: UIImagePickerController.SourceType
    private let onImagePicked: (UIImage) -> Void
    
    @Environment(\.presentationMode) private var presentationMode
    
    public init(sourceType: UIImagePickerController.SourceType, onImagePicked: @escaping (UIImage) -> Void) {
        self.sourceType = sourceType
        self.onImagePicked = onImagePicked
    }
    
    public func makeUIViewController(context: Context) -> UIImagePickerController {
        let picker = UIImagePickerController()
        picker.sourceType = self.sourceType
        picker.delegate = context.coordinator
        return picker
    }
    
    public func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
    
    public func makeCoordinator() -> Coordinator {
        Coordinator(
            onDismiss: { self.presentationMode.wrappedValue.dismiss() },
            onImagePicked: self.onImagePicked
        )
    }
    
    final public class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        
        private let onDismiss: () -> Void
        private let onImagePicked: (UIImage) -> Void
        
        init(onDismiss: @escaping () -> Void, onImagePicked: @escaping (UIImage) -> Void) {
            self.onDismiss = onDismiss
            self.onImagePicked = onImagePicked
        }
        
        public func imagePickerController(_ picker: UIImagePickerController,
                                          didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
            if let image = info[.originalImage] as? UIImage {
                self.onImagePicked(image)
            }
            self.onDismiss()
        }
        public func imagePickerControllerDidCancel(_: UIImagePickerController) {
            self.onDismiss()
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

  • 这个问题是专门询问 SwiftUI 中的 PhotosPicker 的。该解决方案是可行的,但您绝对应该在序言中解释说它本身是不可能的。 (7认同)