SwiftUI AspectRatio 不适用于来自相机的图像

标签 swift xcode uikit uiimagepickercontroller swiftui

我不确定这是否是 SwiftUI 特定的问题。无论如何,我有一个 UIImagePickerController,我通过使用 UIViewControllerRepresentableProtocol 将其实现到 SwiftUI View 中:

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
    }
}

选择设备相机未拍摄的图像时,它可以正常工作。但是,每次我选择由相机本身拍摄的图像时,似乎都没有应用 .aspectRatio 修饰符,因为在这种情况下加载图像的尺寸是扭曲的。有人发现我的代码有问题或知道解决方案吗?

最佳答案

遇到了同样的问题。我使用了@ninjahamster 提出的版本的修改版本,我只是没有调整图像的大小。欢迎任何其他解决方案。

    func resizeImage(image: UIImage) -> UIImage {
        let width = image.size.width
        let height = image.size.height
        UIGraphicsBeginImageContext(CGSize(width: width, height: height))
        image.draw(in: CGRect(x: 0, y: 0, width: width, height: height))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }

关于SwiftUI AspectRatio 不适用于来自相机的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58356020/

相关文章:

ios - 相应地移动 View View 折叠/展开动画

ios - 如何通过UIkit将组件嵌套到组件?

ios - 如何在 View 中沿对角线显示渐变

ios - 将 NSMutableArray 传递给 Swift 中的另一个对象

objective-c - Swift 中的 NS_ENUM

ios - 无法将类型 'UITableViewCell' 的值分配给 swift 中的类型 '...Cell' 错误

ios - 加载项目时Xcode 8 Beta崩溃

angularjs - 最新 XCode 更新后 Ionic Apps 中出现无限摘要循环(仅限 iOS)

iOS - 在横向模式下获取状态栏高度和宽度 0

swift - 剥离时间关闭日期选择器和日期关闭时间选择器 swift