如何用SwiftUI拍摄两张图片并显示?



这是我尝试过的,但是图像没有显示在屏幕上,为什么?

import SwiftUI
struct ContentView: View {
@State var camera = false
@State private var holeTop: UIImage?
@State private var holeBottom: UIImage?
@State private var selectedImage: UIImage?

var body: some View {
VStack(spacing: 0) {
Form {
Section {
HStack {
Circle()
.foregroundColor(.red)
.shadow(radius: 4)
.frame(width: 44, height: 44)
.overlay {
holeTop != nil ? Image(uiImage: holeTop!).resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white) :
Image(systemName: "camera")
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white)
}.onTapGesture {
selectedImage = holeTop
camera = true
}.padding(24)
Text("Hole top")
.foregroundColor(.gray)
}
HStack {
Circle()
.foregroundColor(.red)
.shadow(radius: 4)
.frame(width: 44, height: 44)
.overlay {
holeTop != nil ? Image(uiImage: holeBottom!).resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white) :
Image(systemName: "camera")
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white)
}.onTapGesture {
selectedImage = holeBottom
camera = true
}.padding(24)
Text("Hole bottom")
.foregroundColor(.gray)
}
} header: {
Text("")
}
}
}.sheet(isPresented: $camera) {
CameraView(selectedImage: $selectedImage)
}
}
}
struct CameraView: UIViewControllerRepresentable {
@Binding var selectedImage: UIImage?
@Environment(.presentationMode) var isPresented

func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
return picker
}

func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
uiViewController.sourceType = .camera
}

func makeCoordinator() -> Coordinator {
Coordinator(picker: self)
}
}
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
var picker: CameraView

init(picker: CameraView) {
self.picker = picker
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let selectedImage = info[.originalImage] as? UIImage else { return }
self.picker.selectedImage = selectedImage
self.picker.isPresented.wrappedValue.dismiss()
}
}

问题是selectedImage没有分配给holeTopholeBottom。您正在将holeTop的值分配给selectedImage,而不是引用。

有一种方法可以做到。定义一个action发生在相机解散,然后执行actiononDismiss

struct ContentView: View {
@State var camera = false
@State private var holeTop: UIImage?
@State private var holeBottom: UIImage?
@State private var selectedImage: UIImage?
@State private var action: ()->() = { }

var body: some View {
VStack(spacing: 0) {
Form {
Section {
HStack {
Circle()
.foregroundColor(.red)
.shadow(radius: 4)
.frame(width: 44, height: 44)
.overlay {
holeTop != nil ? Image(uiImage: holeTop!).resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white) :
Image(systemName: "camera")
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white)
}.onTapGesture {
action = {
holeTop = selectedImage
}
camera = true
}.padding(24)
Text("Hole top")
.foregroundColor(.gray)
}
HStack {
Circle()
.foregroundColor(.red)
.shadow(radius: 4)
.frame(width: 44, height: 44)
.overlay {
holeBottom != nil ? Image(uiImage: holeBottom!).resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white) :
Image(systemName: "camera")
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.foregroundColor(.white)
}.onTapGesture {
action = {
holeBottom = selectedImage
}
camera = true
}.padding(24)
Text("Hole bottom")
.foregroundColor(.gray)
}
} header: {
Text("")
}
}
}.sheet(isPresented: $camera, onDismiss: action) {
CameraView(selectedImage: $selectedImage)
}
}
}

最新更新