我有 2 个按钮,一个用于从画廊加载图像,一个用于从相机加载(即拍照)。但无论我尝试什么,我都会不断地加载画廊而不是相机。我一直在我的 UIImagePickerController 中使用以下代码(来自我的谷歌搜索):
//
// ImagePicker.swift
//
import Foundation
import SwiftUI
class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate,
UIImagePickerControllerDelegate {
@Binding var isShown: Bool
@Binding var image: Image?
init(isShown: Binding<Bool>, image: Binding<Image?>) {
_isShown = isShown
_image = image
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
image = Image(uiImage: uiImage)
isShown = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
isShown = false
}
}
struct ImagePicker: UIViewControllerRepresentable {
@Binding var isShown: Bool
@Binding var image: Image?
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
func makeCoordinator() -> ImagePickerCoordinator {
return ImagePickerCoordinator(isShown: $isShown, image: $image)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
return picker
}
}
struct CameraPicker: UIViewControllerRepresentable {
@Binding var isShown: Bool
@Binding var image: Image?
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<CameraPicker>) {
}
func makeCoordinator() -> ImagePickerCoordinator {
return ImagePickerCoordinator(isShown: $isShown, image: $image)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<CameraPicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.sourceType = .camera
picker.allowsEditing = true
picker.delegate = context.coordinator
return picker
}
}
struct CameraView: UIViewControllerRepresentable {
@Binding var isShown: Bool
@Binding var image: Image?
func makeCoordinator() -> CameraView.Coordinator {
Coordinator(self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<CameraView>) -> UIViewController {
let cameraViewController = UIImagePickerController()
cameraViewController.delegate = context.coordinator
cameraViewController.sourceType = .camera
cameraViewController.allowsEditing = false
return cameraViewController
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<CameraView>) {
}
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: CameraView
init(_ cameraView: CameraView) {
self.parent = cameraView
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
parent.image = Image(uiImage: uiImage)
parent.isShown = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
parent.isShown = false
}
}
}
我基本上复制了 ImagePicker 以适应相机(CameraPicker)。当我无法到达任何地方时,还尝试了通过网络搜索查看相机视图。
我是 swift 新手,所以请让我知道是否有更好的方法来做到这一点。
从相机获取图像:
//
// PhotoCaptureView.swift
import SwiftUI
struct PhotoCaptureView: View {
@Binding var showImagePicker: Bool
@Binding var image: Image?
var body: some View {
CameraView(isShown: $showImagePicker, image: $image)
}
}
#if DEBUG
struct PhotoCaptureView_Previews: PreviewProvider {
static var previews: some View {
PhotoCaptureView(showImagePicker: .constant(false), image: .constant(Image("")))
}
}
#endif
要从图库中获取图像:
//
// GalleryCapture.swift
//
import SwiftUI
struct GalleryCaptureView: View {
@Binding var showImagePicker: Bool
@Binding var image: Image?
var body: some View {
ImagePicker(isShown: $showImagePicker, image: $image)
}
}
#if DEBUG
struct GalleryCaptureView_Previews: PreviewProvider {
static var previews: some View {
GalleryCaptureView(showImagePicker: .constant(false), image: .constant(Image("")))
}
}
#endif
我的内容视图:
//
// ContentView.swift
//
import SwiftUI
struct ContentView: View {
@State private var showImagePicker: Bool = false
@State private var image: Image? = nil
// Function that converts an UIImage to Image
func returnImage() -> Image
{
guard let img = image else {
fatalError("Unable to load image")
}
return img
// return Image(uiImage: img)
}
// Main Body
var body: some View {
NavigationView {
VStack {
VStack {
image?.resizable()
.frame(width: 299, height: 299)
.cornerRadius(6)
}
// returnImage()
// .resizable()
// .frame(width: 299, height: 299)
// .cornerRadius(6)
// .onTapGesture {
// self.showImagePicker = true
// }
HStack {
Button(action: {self.showImagePicker.toggle()}) {
Image(systemName: "photo")
.font(.largeTitle)
.foregroundColor(.white)
Text("Gallery")
.foregroundColor(.white)
}.padding()
.background(Color.blue)
.cornerRadius(10)
.sheet(isPresented: self.$showImagePicker) {
GalleryCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
}
Button(action: {self.showImagePicker.toggle()}) {
Image(systemName: "camera")
.font(.largeTitle)
.foregroundColor(.white)
Text("Camera")
.foregroundColor(.white)
}.padding()
.background(Color.green)
.cornerRadius(10)
.sheet(isPresented: self.$showImagePicker) {
PhotoCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
}
}
}
.navigationBarTitle("My first app")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我想使用 MLkit,所以可能还需要考虑使用 UIImage 而不是 Image。