我正在使用 UIImagePickerController 从相机捕获照片或从照片库中选择照片,然后显示图像。这对于横向/水平方向的照片效果很好,但纵向/垂直方向的照片会水平拉伸(stretch)。
我尝试过 .scaledToFit() 和 .aspectRatio(contentMode: .fit),但它仍然显示拉伸(stretch)。非常感谢任何帮助。
显示图像的代码:
struct AddNewItem: View {
@State private var showImagePicker: Bool = true
@State private var image: UIImage = nil
@State var showCamera: Bool = false
@State private var showImageEditor: Bool = false
var body: some View {
VStack {
Image(uiImage: image ?? UIImage(named: "placeholder")!)
.resizable()
.scaledToFit()
.aspectRatio(contentMode: .fit)
}
//Show the photo capture view
.sheet(isPresented: self.$showImagePicker) {
PhotoCaptureView(showImagePicker: self.$showImagePicker, image: self.$image, showImageEditor: self.$showImageEditor, showCamera: self.$showCamera)
}
}
}
图像选择器协调员:
class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding var isShown: Bool
@Binding var image: UIImage?
@Binding var showEditor: Bool
init(isShown: Binding<Bool>, image: Binding<UIImage?>, showEditor: Binding<Bool>) {
_isShown = isShown
_image = image
_showEditor = showEditor
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
image = uiImage
isShown = false
showEditor = true
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
isShown = false
}
}
图像选择器:
struct ImagePicker: UIViewControllerRepresentable {
@Binding var pickerIsShown: Bool
@Binding var image: UIImage?
@Binding var showImageEditor: Bool
@Binding var showCamera: Bool
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
func makeCoordinator() -> ImagePickerCoordinator {
return ImagePickerCoordinator(isShown: $pickerIsShown, image: $image, showEditor: $showImageEditor)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
if showCamera {
picker.sourceType = .camera
} else {
picker.sourceType = .photoLibrary
}
picker.delegate = context.coordinator
return picker
}
}
照片捕捉 View :
struct PhotoCaptureView: View {
@Binding var showImagePicker: Bool
@Binding var image: UIImage?
@Binding var showImageEditor: Bool
@Binding var showCamera: Bool
var body: some View {
ImagePicker(pickerIsShown: $showImagePicker, image: $image, showImageEditor: $showImageEditor, showCamera: $showCamera)
}
}
最佳答案
我也有同样的问题。我通过在 makeUIViewController 函数中将 editMode 设置为 true 来避免这种情况:
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = true
imagePicker.delegate = context.coordinator
return imagePicker
}
并通过在带有信息功能的 didFinishPickingMedia 中使用编辑后的图像而不是原始图像:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image = info[.editedImage] as? UIImage else {
print("No image found")
return
}
parent.imageController.originalImage = image
parent.showImagePicker = false
}
这可以防止图像被拉伸(stretch)。然而,用户只能选择被裁剪为正方形的照片。我正在研究解决方法..
关于ios - 在纵向模式下拍摄的图像选择器 (UIImagePickerController) 中的照片显示拉伸(stretch) - Xcode 11/SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58325527/