Xcode 11.1 только принимает квадратные фотографии - нужно 4: 3 - PullRequest
0 голосов
/ 06 октября 2019

square only

Я использую камеру для захвата изображений для приложения. Как только я коснусь кнопки с фотографией, я смогу сохранить фотографию только в квадратном формате. Я хочу сохранить формат 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

Будем благодарны за любые рекомендации.

1 Ответ

0 голосов
/ 07 октября 2019

Информационная установка didFinishPickingMediaWithInfo должна указывать «originalImage», чтобы избежать только квадратного изображения. Однако даже в отредактированной версии кажется, что вы можете только перемещать изображение, а не изменять его.

измените указанную выше информационную строку на: guard let image = info [.originalImage] как? UIImage else {

Затем установите: vc.allowsEditing = false

Важно, что в документации сказано, что: «Класс UIImagePickerController поддерживает только портретный режим».

...