【问题标题】:Xcode 11.1 Only Takes Square Photos - Need 4:3Xcode 11.1 只拍方形照片 - 需要 4:3
【发布时间】:2019-10-06 00:01:10
【问题描述】:

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

这是一个 SwiftUI 应用程序。在下面的 CameraViewController 中,如果我删除了 allowedEditing 选项,选择器冻结 - 既不是使用照片,也不是重拍按钮功能。这 应用程序不会崩溃,只是视图被冻结。我可以向下滑动视图 关闭并继续使用该应用。

我从一个按钮调用下面的 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 只是布尔值,用于确定是否显示相机选项。

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

Xcode 11.1 (11A1027) 我使用的是 iPhone X iOS 13.1.2

任何指导将不胜感激。

【问题讨论】:

  • 为什么标记为SwiftUI?您是否想说您的UIKit 代码在情节提要应用程序中运行良好?老实说,我什至不确定这是 Xcode 11.1 还是 iOS 13.1.2 问题。我的代码工作正常。编辑:我的应用程序是 Xcode,包括 11.2 beta,使用 UIImagePickerController,并且是故事板应用程序。我从来没有在 SwiftUI 中尝试过这个(只是在可表示中选择选定的图像),所以 可能 是你的问题。但我的问题是——你的代码在故事板应用程序中工作吗?
  • 多年来,我在许多 Swift 应用程序中使用了基本相同的代码。效果很好。

标签: xcode uiimagepickercontroller swiftui


【解决方案1】:

didFinishPickingMediaWithInfo 的 info 设置需要指定“originalImage”以避免只有正方形的图片。然而,即使是经过编辑的版本,您似乎也只能移动图像 - 而不能改变外观。

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

然后设置: vc.allowsEditing = false

重要的是,文档告诉我:“UIImagePickerController 类仅支持纵向模式。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多