Xcode11.1只拍正方形照片-需要4:3

Xcode 11.1 Only Takes Square Photos - Need 4:3

我正在使用相机为应用程序拍摄图像。一旦我触摸照片按钮,我 只能以正方形格式保存照片。我想保留 4:3 格式 较旧的相机,并最终允许用户根据需要选择 16:9。我未曾 能够找到任何代码以编程方式选择纵横比。我只会得到正方形。我什至 尝试在设备上的相机设置中锁定相机模式。值得庆幸的是, 没用。

它是一个 SwiftUI 应用程序。在下面的 CameraViewController 中,如果我删除 allowsEditing 选项,选取器会冻结 - 使用照片和重拍按钮都不起作用。这 应用程序不会崩溃,只是视图被冻结。我可以向下滑动视图 关闭并继续使用该应用程序。

我从一个按钮调用下面的 PhotoCaptureView master/detail 等价物。

照片捕捉视图:

import SwiftUI
struct PhotoCaptureView: View {

    @EnvironmentObject var cameraSettings: CameraSettings
    @Binding var photos: [UIImage]

    var body: some View {
        return VStack {
            CameraViewController(photos: $photos)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
        }.edgesIgnoringSafeArea(.all)
    }
}

和模型视图CameraViewController:

import UIKit
import SwiftUI
import MobileCoreServices
import AVFoundation

struct CameraViewController: UIViewControllerRepresentable {

    @EnvironmentObject var cameraSettings: CameraSettings
    @Binding var photos: [UIImage]

    func updateUIViewController(_ uiViewContyroller: UIImagePickerController, context: Context) {
        //no code here
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<CameraViewController>) -> UIImagePickerController {
        let vc = UIImagePickerController()
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            vc.sourceType = .camera
            vc.allowsEditing = true
            vc.delegate = context.coordinator
            return vc
        }
        return UIImagePickerController()
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        var parent: CameraViewController
        init(_ imagePickerController: CameraViewController) {
            self.parent = imagePickerController
        }

        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            guard let image = info[.editedImage] as? UIImage else {
                print("no image found")
                return
            }
            print("Image taken successfully, with size \(image.size)")
            parent.photos.append(image)
            picker.dismiss(animated: true) {
                print("in dismiss after successful picture")
            }
        }

        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            picker.dismiss(animated: true) {
                print("in did cancel")
            }
        }

        private func pickerController(_ controller: UIImagePickerController, didSelect image: UIImage?) {
            controller.dismiss(animated: true, completion: nil)
        }
    }
}

CameraSettings 只是布尔值,用于确定是否显示相机选项。

class CameraSettings: ObservableObject {
    @Published var isAuthorized: Bool = false
    @Published var isCameraAvailable: Bool = false
}

Xcode 11.1 (11A1027) 我正在使用 iPhone X iOS 13.1.2

如有任何指导,我们将不胜感激。

didFinishPickingMediaWithInfo 的info 设置需要指定"originalImage" 以避免出现只有方形的图片。然而,即使使用编辑后的版本,您似乎也只能移动图像 - 而不能改变纵横比。

将上面的信息行更改为: guard let image = info[.originalImage] as? UIImage 其他 {

然后设置: vc.allowsEditing = 假

重要的是文档告诉我:"The UIImagePickerController class supports portrait mode only."