Hil*_*ary 5 image uiimagepickercontroller ios swiftui xcode11
我正在使用 UIImagePickerController 从相机捕获照片或从照片库中选择,然后显示图像。这适用于横向/水平方向的照片,但纵向/垂直方向的照片显示为水平拉伸。
我试过 .scaledToFit() 和 .aspectRatio(contentMode: .fit),但它仍然显示拉伸。很感谢任何形式的帮助。
显示图片的代码:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
}
图像选择器协调员:
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
}
Run Code Online (Sandbox Code Playgroud)
}
图像选择器:
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
}
Run Code Online (Sandbox Code Playgroud)
}
照片捕捉视图:
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)
}
Run Code Online (Sandbox Code Playgroud)
}
我有同样的问题。我通过在 makeUIViewController 函数中将 editMode 设置为 true 来避免这种情况:
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = true
imagePicker.delegate = context.coordinator
return imagePicker
}
Run Code Online (Sandbox Code Playgroud)
并通过在带有 info 函数的 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
}
Run Code Online (Sandbox Code Playgroud)
这可以防止图像被拉伸。然而,用户只能选择被裁剪为正方形的照片。我正在研究解决方法..
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |