SwiftUI AspectRatio不适用于相机中的图像

时间:2019-10-12 16:11:11

标签: swift xcode uikit uiimagepickercontroller swiftui

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

public static void main(String[] args){
    System.out.print("input the array'size : ");
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
int arr[]=new int[size];


System.out.print("input the array'value :");
for(int i=0; i<size; i++){
    int var = sc.nextInt();
    arr[i] = var; 
}

System.out.print("inputed value: ");
for(int i=0; i<size; i++) {
System.out.print(arr[i]+ " ");
}

int max = 0;
for(int j=0; j<size; j++){
    if(max<arr[j+1]){
    max = arr[j];   
    }
    else {
    continue;
    }
}
System.out.println("the largest number in array :"+ max);
}

}

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

}

}

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

3 个答案:

答案 0 :(得分:7)

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

for ($i=0; $i -le 2; $i++){
    pscp -pw testing -r "$($ArrayIP[$i]):/cf/conf/backup/*" "$($ArrayDestination[$i])"
}

答案 1 :(得分:2)

我遇到了同样的问题。我没有找到解决方案,但是找到了解决方法。 我在协调器类中使用函数调整了图像的大小,但我将其返回到视图。为我工作。

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

答案 2 :(得分:2)

我遇到了同样的问题。我没意识到这是SwiftUI所缺少的!现在,我已经应用了忍者仓鼠的解决方法。

我的代码在这里,以防有人需要参考。查看func didFinishPickingMediaWithInfo中的更改。

import SwiftUI

final class ImagePickerCoordinator: NSObject {
    @Binding var image: UIImage?
    @Binding var takePhoto: Bool

    init(image: Binding<UIImage?>, takePhoto: Binding<Bool>) {
        _image = image
        _takePhoto = takePhoto
    }
}

struct ImagePicker: UIViewControllerRepresentable {
    @Binding var image: UIImage?
    @Binding var takePhoto: Bool

    func makeCoordinator() -> ImagePickerCoordinator {
        ImagePickerCoordinator(image: $image, takePhoto: $takePhoto)
    }

    func makeUIViewController(context: Context) -> UIImagePickerController {
        let pickerController = UIImagePickerController()
        pickerController.delegate = context.coordinator
        return pickerController
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
        switch self.takePhoto {
        case true:
            uiViewController.sourceType = .camera
            uiViewController.showsCameraControls = true
        case false:
            uiViewController.sourceType = .photoLibrary
        }
        uiViewController.allowsEditing = false
    }
}

extension ImagePickerCoordinator: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let imageOriginal = info[.originalImage] as? UIImage {
//            image = imageOriginal
            image = resizeImage(image: imageOriginal)
        }
        if let imageEdited = info[.editedImage] as? UIImage {
            image = imageEdited
        }

        picker.dismiss(animated: true, completion: nil)
    }

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

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
}