ios - 在纵向模式下拍摄的图像选择器 (UIImagePickerController) 中的照片显示拉伸(stretch) - Xcode 11/SwiftUI

标签 ios image uiimagepickercontroller swiftui xcode11

我正在使用 UIImagePickerController 从相机捕获照片或从照片库中选择照片,然后显示图像。这对于横向/水平方向的照片效果很好,但纵向/垂直方向的照片会水平拉伸(stretch)。

我尝试过 .scaledToFit() 和 .aspectRatio(contentMode: .fit),但它仍然显示拉伸(stretch)。非常感谢任何帮助。

See stretched photo

显示图像的代码:

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/

相关文章:

iphone - iOS 4.3 改变了 UIImagePickerController 相机覆盖 View 的转换

ios - 将 JPEG 用于启动图像

iphone - 多个 View Controller 的重复代码

ios - layer.mask 渐变在 iOS7 中是 Solid

JQuery - 通过 alt 或标题选择图像

ios - Swift - 从模态视图访问 UIImagePickerController

ios - 将curl命令翻译成NSMutableUrlRequest

php - 用PHP和MySql上传和删除图片

html - img <a href> 链接延伸到父 div 的整个宽度,而不是仅覆盖 img

ios - 加载 UIImagePickerController 更快?