Я использую камеру для захвата изображений для приложения. Как только я коснусь кнопки с фотографией, я смогу сохранить фотографию только в квадратном формате. Я хочу сохранить формат 4: 3 для старых камер и в конечном итоге позволить пользователю выбрать 16: 9 при желании. Мне не удалось найти код, чтобы программно выбрать соотношение сторон. Я получаю только квадрат. Я даже пытался заблокировать режим камеры в настройках камеры на устройстве. К счастью, это не сработало.
Это приложение SwiftUI. В нижеприведенном CameraViewController, если я уберу опцию allowEditing, сборщик зависнет - ни кнопки «Использовать фото», ни кнопки «Возврат» не работают. Приложение не вылетает, просто представление заморожено. Я могу провести вниз по представлению, чтобы закрыть и продолжить использование приложения.
Я вызываю представленный ниже PhotoCaptureView с кнопки, которая будет подробным представлением эквивалента мастер / деталь.
PhotoCaptureView:
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 - это просто Bools, чтобы определить, следует ли отображать параметр камеры.
class CameraSettings: ObservableObject {
@Published var isAuthorized: Bool = false
@Published var isCameraAvailable: Bool = false
}
Xcode11.1 (11A1027) Я использую iPhone X iOS 13.1.2
Будем благодарны за любые рекомендации.