No estoy seguro de si se trata de un problema específico de SwiftUI. De todos modos, tengo un UIImagePickerController que implementé en una vista SwiftUI usando el UIViewControllerRepresentableProtocol:
struct ContentView: View {
@State var showCameraView = false
@State var showImagePicker = false
@State var UserImage = Image("user")
var body: some View {
VStack {
UserImage
.resizable()
.frame(width: 200, height: 200)
.scaledToFit()
.background(Color.gray)
.cornerRadius(200)
.clipped()
Button(action: {self.showImagePicker = true}) {
Text("Choose from camera roll")
}
.padding(.top, 10)
}
.sheet(isPresented: $showImagePicker) {
ImagePicker(showImagePicker: self.$showImagePicker, pickedImage: self.$UserImage)
}
}
}
struct ImagePicker: UIViewControllerRepresentable {
@Binding var showImagePicker: Bool
@Binding var pickedImage: Image
func makeCoordinator() -> ImagePicker.Coordinator {
Coordinator(self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.delegate = context.coordinator
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
return
}
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: ImagePicker
init(_ imagePicker: ImagePicker) {
self.parent = imagePicker
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
parent.pickedImage = Image(uiImage: uiImage)
parent.showImagePicker = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
parent.showImagePicker = false
}
}
}
Funciona bien al elegir imágenes que no son tomadas por la cámara del dispositivo. Sin embargo, cada vez que elijo una imagen que fue tomada por la cámara, parece que el modificador .aspectRatio no se aplica porque las dimensiones de la imagen cargada están distorsionadas en este caso. ¿Alguien ve algo mal en mi código o conoce una solución?
Tuve el mismo problema. Utilicé una versión modificada de la propuesta por @ninjahamster donde simplemente no cambié el tamaño de la imagen. Cualquier otra solución es bienvenida.
fuente
Me encontré con el mismo problema. ¡No me di cuenta de que falta SwiftUI! Ahora he aplicado la solución alternativa de ninjahamster.
Mi código aquí, en caso de que alguien necesite alguna referencia. Ver los cambios en func
didFinishPickingMediaWithInfo
.fuente