SwiftUI 中的新 PhotosPicker 可以打开相机而不是照片库

问题描述 投票:0回答:2

有什么方法可以让新的 PhotosPicker 打开相机而不是打开 photoLibrary,我记得在旧的 UIImagePickerController 中,如果使用相机或从图片中选择,用户可以在选择器中选择此选项。


ImagePikerCircular(im: im, dataImage: $dataImage)
            .overlay(alignment: .bottomTrailing) {
                PhotosPicker(selection: $im.imageSelection,
                             matching: .images,
                             photoLibrary: .shared()) {
                    Image(systemName: "pencil.circle.fill")
                        .symbolRenderingMode(.multicolor)
                        .font(.system(size: 30))
                        .foregroundColor(.accentColor)
                }
                .buttonStyle(.borderless)
                .photosPickerStyle(.presentation)
            }

swift swiftui uiimagepickercontroller
2个回答
3
投票

不,无法使用 PhotosPicker 打开相机,您需要创建自己的选择对话框,当用户点击相机时,打开旧的 UIImagePickerController,您可以像这样创建一个 UIViewControllerRepresentable :

struct CameraPickerView: UIViewControllerRepresentable {
    
    private var sourceType: UIImagePickerController.SourceType = .camera
    private let onImagePicked: (UIImage) -> Void
    
    @Environment(\.presentationMode) private var presentationMode
    
    public init(onImagePicked: @escaping (UIImage) -> Void) {
        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()
        }
    }
}

然后,您可以向选择器呈现全屏覆盖:

.fullScreenCover(isPresented: $showCameraPicker) {
    CameraPickerView() { image in
        // Do what you want with your image.
    }
}

来源


0
投票

这里是如何使用 Apple 的 SwiftUI 访问相机的最佳展示。 https://developer.apple.com/tutorials/sample-apps/capturingphotos-captureandsave

© www.soinside.com 2019 - 2024. All rights reserved.