【发布时间】: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