Tôi không chắc đây có phải là sự cố cụ thể của SwiftUI không. Dù sao, tôi có một UIImagePickerContoder mà tôi đã triển khai trong chế độ xem SwiftUI bằng cách sử dụng UIViewControllRepftimeableProtatio:
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
}
}
}
Nó hoạt động tốt khi chọn hình ảnh không được chụp bằng camera của thiết bị. Tuy nhiên, mỗi khi tôi chọn một Ảnh được chụp bởi chính máy ảnh, có vẻ như công cụ sửa đổi .aspectRatio không được áp dụng vì kích thước của Ảnh đã tải bị biến dạng trong trường hợp này. Có ai phát hiện ra một cái gì đó sai trong mã của tôi hoặc biết một giải pháp?