SwiftUI AspectRatio không hoạt động đối với hình ảnh từ máy ảnh


8

Tôi không chắc đây có phải là sự cố cụ thể của SwiftUI không. Dù sao, tôi có một UIImagePickerContoder mà tôi đã triển khai trong chế độ xem SwiftUI bằng cách sử dụng UIViewControllRepftimeableProtatio:

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

}

Nó hoạt động tốt khi chọn hình ảnh không được chụp bằng camera của thiết bị. Tuy nhiên, mỗi khi tôi chọn một Ảnh được chụp bởi chính máy ảnh, có vẻ như công cụ sửa đổi .aspectRatio không được áp dụng vì kích thước của Ảnh đã tải bị biến dạng trong trường hợp này. Có ai phát hiện ra một cái gì đó sai trong mã của tôi hoặc biết một giải pháp?

Câu trả lời:


5

Tôi đã có cùng một vấn đề. Tôi đã không tìm thấy một giải pháp, nhưng một cách giải quyết. Tôi thay đổi kích thước hình ảnh với một chức năng trong lớp điều phối viên, bevor tôi trả nó về chế độ xem. Làm việc cho tôi.

func resizeImage(image: UIImage) -> UIImage {
    let scale = 300 / image.size.width
    let newHeight = image.size.height * scale
    UIGraphicsBeginImageContext(CGSize(width: 300, height: newHeight))
    image.draw(in: CGRect(x: 0, y: 0, width: 300, height: newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
}

1
Câu trả lời này hoạt động thực sự tốt, cảm ơn bạn!
Daniel Barclay

3

Có cùng một vấn đề. Tôi đã sử dụng một phiên bản sửa đổi của phiên bản được đề xuất bởi @ninjahamster, nơi tôi chỉ đơn giản là không thay đổi kích thước hình ảnh. Bất kỳ giải pháp khác đều được chào đón.

    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!
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.