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."
我正在使用相机为应用程序拍摄图像。一旦我触摸照片按钮,我 只能以正方形格式保存照片。我想保留 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."