Ios Can';t使用SwiftUI加载相机
我有两个按钮,一个用于从多媒体资料加载图像,另一个用于从相机加载图像(即拍照)。但不管我怎么努力,我总是得到画廊的负载,而不是相机。我在UIImagePickerController中使用了以下代码(来自谷歌搜索):Ios Can';t使用SwiftUI加载相机,ios,xcode,camera,uiimagepickercontroller,swift5.1,Ios,Xcode,Camera,Uiimagepickercontroller,Swift5.1,我有两个按钮,一个用于从多媒体资料加载图像,另一个用于从相机加载图像(即拍照)。但不管我怎么努力,我总是得到画廊的负载,而不是相机。我在UIImagePickerController中使用了以下代码(来自谷歌搜索): // // ImagePicker.swift // import Foundation import SwiftUI class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate,
//
// 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
}
}
}
要从库中获取图像,请执行以下操作:
//
// 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。在按钮上,您必须使用self.showImagePicker来实现如下设置:
var body: some View {
NavigationView{
VStack {
image?.resizable().scaledToFit()
Button("Open Camera"){
self.showImagePicker = true
}.padding()
.foregroundColor(Color.white)
.background(Color.purple)
.cornerRadius(10)
}.sheet(isPresented: self.$showImagePicker){
PhotoCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
}
.navigationBarTitle(Text("Camera"))
}
}
在makeUIViewController方法中,只需在picker.delegate=context.coordinator的正下方添加以下代码:
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
if !UIImagePickerController.isSourceTypeAvailable(.camera){
picker.sourceType = .photoLibrary
} else {
picker.sourceType = .camera
}
return picker
}
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->UIImagePickerController{
让picker=UIImagePickerController()
picker.delegate=context.coordinator
if!UIImagePickerController.isSourceTypeAvailable(.camera){
picker.sourceType=.photoLibrary
}否则{
picker.sourceType=.camera
}
回程选择器
}
注意:摄像机仅在真实设备中打开,而不能在模拟器中打开
或
将你的代码与这个很棒的代码进行比较,从我的角度来看,它的工作最终变得非常简单。我的错误是使用了与我用于gallery相同的布尔值。我一定是做错了什么,因为它仍然只是在电话上打开gallery。是的,那是我试图遵循的指南之一是的,我也有。self.showImagePicker.toggle()不也是这样做的吗?
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
if !UIImagePickerController.isSourceTypeAvailable(.camera){
picker.sourceType = .photoLibrary
} else {
picker.sourceType = .camera
}
return picker
}