有什么方法可以让新的 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)
}
不,无法使用 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.
}
}
这里是如何使用 Apple 的 SwiftUI 访问相机的最佳展示。 https://developer.apple.com/tutorials/sample-apps/capturingphotos-captureandsave