gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:36:44 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com