iOS 2.5.1 - Fixed Camera Rotation
This commit is contained in:
@@ -465,7 +465,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 37;
|
CURRENT_PROJECT_VERSION = 38;
|
||||||
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
||||||
DRIVERKIT_DEPLOYMENT_TARGET = 24.6;
|
DRIVERKIT_DEPLOYMENT_TARGET = 24.6;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -487,7 +487,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 15.6;
|
MACOSX_DEPLOYMENT_TARGET = 15.6;
|
||||||
MARKETING_VERSION = 2.5.0;
|
MARKETING_VERSION = 2.5.1;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently;
|
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
@@ -513,7 +513,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 37;
|
CURRENT_PROJECT_VERSION = 38;
|
||||||
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
||||||
DRIVERKIT_DEPLOYMENT_TARGET = 24.6;
|
DRIVERKIT_DEPLOYMENT_TARGET = 24.6;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -535,7 +535,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 15.6;
|
MACOSX_DEPLOYMENT_TARGET = 15.6;
|
||||||
MARKETING_VERSION = 2.5.0;
|
MARKETING_VERSION = 2.5.1;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently;
|
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
@@ -602,7 +602,7 @@
|
|||||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||||
CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements;
|
CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 37;
|
CURRENT_PROJECT_VERSION = 38;
|
||||||
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = SessionStatusLive/Info.plist;
|
INFOPLIST_FILE = SessionStatusLive/Info.plist;
|
||||||
@@ -613,7 +613,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 2.5.0;
|
MARKETING_VERSION = 2.5.1;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive;
|
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@@ -632,7 +632,7 @@
|
|||||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||||
CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements;
|
CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 37;
|
CURRENT_PROJECT_VERSION = 38;
|
||||||
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
DEVELOPMENT_TEAM = 4BC9Y2LL4B;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = SessionStatusLive/Info.plist;
|
INFOPLIST_FILE = SessionStatusLive/Info.plist;
|
||||||
@@ -643,7 +643,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 2.5.0;
|
MARKETING_VERSION = 2.5.1;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive;
|
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
|||||||
Binary file not shown.
@@ -1,52 +1,104 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
/// A native iOS camera picker presented from a hosting controller so it can
|
||||||
|
/// respect all supported interface orientations. Present with `.fullScreenCover()`.
|
||||||
struct CameraImagePicker: UIViewControllerRepresentable {
|
struct CameraImagePicker: UIViewControllerRepresentable {
|
||||||
@Binding var isPresented: Bool
|
@Environment(\.dismiss) private var dismiss
|
||||||
let onImageCaptured: (UIImage) -> Void
|
let onImageCaptured: (UIImage) -> Void
|
||||||
|
|
||||||
func makeUIViewController(context: Context) -> UIImagePickerController {
|
func makeUIViewController(context: Context) -> CameraHostViewController {
|
||||||
let picker = UIImagePickerController()
|
let host = CameraHostViewController()
|
||||||
picker.delegate = context.coordinator
|
host.onImageCaptured = { image in
|
||||||
picker.sourceType = .camera
|
onImageCaptured(image)
|
||||||
picker.cameraCaptureMode = .photo
|
dismiss()
|
||||||
picker.cameraDevice = .rear
|
}
|
||||||
picker.allowsEditing = false
|
host.onCancel = {
|
||||||
return picker
|
dismiss()
|
||||||
|
}
|
||||||
|
host.pickerDelegate = context.coordinator
|
||||||
|
context.coordinator.onImageCaptured = { image in
|
||||||
|
onImageCaptured(image)
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
context.coordinator.onCancel = {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
return host
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
|
func updateUIViewController(_ uiViewController: CameraHostViewController, context: Context) {
|
||||||
// Nothing here actually... Q_Q
|
// No dynamic updates needed
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeCoordinator() -> Coordinator {
|
func makeCoordinator() -> Coordinator {
|
||||||
Coordinator(self)
|
Coordinator()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
|
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
|
||||||
let parent: CameraImagePicker
|
var onImageCaptured: ((UIImage) -> Void)?
|
||||||
|
var onCancel: (() -> Void)?
|
||||||
init(_ parent: CameraImagePicker) {
|
|
||||||
self.parent = parent
|
|
||||||
}
|
|
||||||
|
|
||||||
func imagePickerController(
|
func imagePickerController(
|
||||||
_ picker: UIImagePickerController,
|
_ picker: UIImagePickerController,
|
||||||
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
|
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
|
||||||
) {
|
) {
|
||||||
if let image = info[.originalImage] as? UIImage {
|
picker.dismiss(animated: true) {
|
||||||
parent.onImageCaptured(image)
|
if let image = info[.originalImage] as? UIImage {
|
||||||
|
self.onImageCaptured?(image)
|
||||||
|
} else {
|
||||||
|
self.onCancel?()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
parent.isPresented = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
|
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
|
||||||
parent.isPresented = false
|
picker.dismiss(animated: true) {
|
||||||
|
self.onCancel?()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extension to check camera availability
|
// MARK: - Hosting VC to own presentation/orientation
|
||||||
|
final class CameraHostViewController: UIViewController {
|
||||||
|
var onImageCaptured: ((UIImage) -> Void)?
|
||||||
|
var onCancel: (() -> Void)?
|
||||||
|
weak var pickerDelegate: (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
|
||||||
|
|
||||||
|
private var didPresent = false
|
||||||
|
|
||||||
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
|
super.viewDidAppear(animated)
|
||||||
|
presentIfNeeded()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func presentIfNeeded() {
|
||||||
|
guard !didPresent, UIImagePickerController.isSourceTypeAvailable(.camera) else { return }
|
||||||
|
didPresent = true
|
||||||
|
|
||||||
|
let picker = UIImagePickerController()
|
||||||
|
picker.delegate = pickerDelegate
|
||||||
|
picker.sourceType = .camera
|
||||||
|
picker.cameraCaptureMode = .photo
|
||||||
|
picker.cameraDevice = .rear
|
||||||
|
picker.allowsEditing = false
|
||||||
|
picker.modalPresentationStyle = .fullScreen
|
||||||
|
|
||||||
|
present(picker, animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
|
||||||
|
// Defer to app-supported orientations; returning .all allows rotation when permitted by the app
|
||||||
|
return .all
|
||||||
|
}
|
||||||
|
|
||||||
|
override var shouldAutorotate: Bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Camera Availability Check
|
||||||
extension CameraImagePicker {
|
extension CameraImagePicker {
|
||||||
static var isCameraAvailable: Bool {
|
static var isCameraAvailable: Bool {
|
||||||
UIImagePickerController.isSourceTypeAvailable(.camera)
|
UIImagePickerController.isSourceTypeAvailable(.camera)
|
||||||
|
|||||||
@@ -26,19 +26,19 @@ struct AddAttemptView: View {
|
|||||||
|
|
||||||
enum SheetType: Identifiable {
|
enum SheetType: Identifiable {
|
||||||
case photoOptions
|
case photoOptions
|
||||||
case camera
|
|
||||||
|
|
||||||
var id: Int {
|
var id: Int {
|
||||||
switch self {
|
switch self {
|
||||||
case .photoOptions: return 0
|
case .photoOptions: return 0
|
||||||
case .camera: return 1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@State private var activeSheet: SheetType?
|
@State private var activeSheet: SheetType?
|
||||||
|
@State private var showCamera = false
|
||||||
@State private var showPhotoPicker = false
|
@State private var showPhotoPicker = false
|
||||||
@State private var isPhotoPickerActionPending = false
|
@State private var isPhotoPickerActionPending = false
|
||||||
|
@State private var isCameraActionPending = false
|
||||||
|
|
||||||
private var activeProblems: [Problem] {
|
private var activeProblems: [Problem] {
|
||||||
dataManager.activeProblems(forGym: gym.id)
|
dataManager.activeProblems(forGym: gym.id)
|
||||||
@@ -110,6 +110,11 @@ struct AddAttemptView: View {
|
|||||||
.sheet(
|
.sheet(
|
||||||
item: $activeSheet,
|
item: $activeSheet,
|
||||||
onDismiss: {
|
onDismiss: {
|
||||||
|
if isCameraActionPending {
|
||||||
|
showCamera = true
|
||||||
|
isCameraActionPending = false
|
||||||
|
return
|
||||||
|
}
|
||||||
if isPhotoPickerActionPending {
|
if isPhotoPickerActionPending {
|
||||||
showPhotoPicker = true
|
showPhotoPicker = true
|
||||||
isPhotoPickerActionPending = false
|
isPhotoPickerActionPending = false
|
||||||
@@ -123,7 +128,8 @@ struct AddAttemptView: View {
|
|||||||
imageData: $imageData,
|
imageData: $imageData,
|
||||||
maxImages: 5,
|
maxImages: 5,
|
||||||
onCameraSelected: {
|
onCameraSelected: {
|
||||||
activeSheet = .camera
|
isCameraActionPending = true
|
||||||
|
activeSheet = nil
|
||||||
},
|
},
|
||||||
onPhotoLibrarySelected: {
|
onPhotoLibrarySelected: {
|
||||||
isPhotoPickerActionPending = true
|
isPhotoPickerActionPending = true
|
||||||
@@ -132,16 +138,12 @@ struct AddAttemptView: View {
|
|||||||
activeSheet = nil
|
activeSheet = nil
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
case .camera:
|
}
|
||||||
CameraImagePicker(
|
}
|
||||||
isPresented: Binding(
|
.fullScreenCover(isPresented: $showCamera) {
|
||||||
get: { activeSheet == .camera },
|
CameraImagePicker { capturedImage in
|
||||||
set: { if !$0 { activeSheet = nil } }
|
if let jpegData = capturedImage.jpegData(compressionQuality: 0.8) {
|
||||||
)
|
imageData.append(jpegData)
|
||||||
) { capturedImage in
|
|
||||||
if let jpegData = capturedImage.jpegData(compressionQuality: 0.8) {
|
|
||||||
imageData.append(jpegData)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -778,19 +780,19 @@ struct EditAttemptView: View {
|
|||||||
|
|
||||||
enum SheetType: Identifiable {
|
enum SheetType: Identifiable {
|
||||||
case photoOptions
|
case photoOptions
|
||||||
case camera
|
|
||||||
|
|
||||||
var id: Int {
|
var id: Int {
|
||||||
switch self {
|
switch self {
|
||||||
case .photoOptions: return 0
|
case .photoOptions: return 0
|
||||||
case .camera: return 1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@State private var activeSheet: SheetType?
|
@State private var activeSheet: SheetType?
|
||||||
|
@State private var showCamera = false
|
||||||
@State private var showPhotoPicker = false
|
@State private var showPhotoPicker = false
|
||||||
@State private var isPhotoPickerActionPending = false
|
@State private var isPhotoPickerActionPending = false
|
||||||
|
@State private var isCameraActionPending = false
|
||||||
|
|
||||||
private var availableProblems: [Problem] {
|
private var availableProblems: [Problem] {
|
||||||
guard let session = dataManager.session(withId: attempt.sessionId) else {
|
guard let session = dataManager.session(withId: attempt.sessionId) else {
|
||||||
@@ -883,6 +885,11 @@ struct EditAttemptView: View {
|
|||||||
.sheet(
|
.sheet(
|
||||||
item: $activeSheet,
|
item: $activeSheet,
|
||||||
onDismiss: {
|
onDismiss: {
|
||||||
|
if isCameraActionPending {
|
||||||
|
showCamera = true
|
||||||
|
isCameraActionPending = false
|
||||||
|
return
|
||||||
|
}
|
||||||
if isPhotoPickerActionPending {
|
if isPhotoPickerActionPending {
|
||||||
showPhotoPicker = true
|
showPhotoPicker = true
|
||||||
isPhotoPickerActionPending = false
|
isPhotoPickerActionPending = false
|
||||||
@@ -896,7 +903,8 @@ struct EditAttemptView: View {
|
|||||||
imageData: $imageData,
|
imageData: $imageData,
|
||||||
maxImages: 5,
|
maxImages: 5,
|
||||||
onCameraSelected: {
|
onCameraSelected: {
|
||||||
activeSheet = .camera
|
isCameraActionPending = true
|
||||||
|
activeSheet = nil
|
||||||
},
|
},
|
||||||
onPhotoLibrarySelected: {
|
onPhotoLibrarySelected: {
|
||||||
isPhotoPickerActionPending = true
|
isPhotoPickerActionPending = true
|
||||||
@@ -905,16 +913,12 @@ struct EditAttemptView: View {
|
|||||||
activeSheet = nil
|
activeSheet = nil
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
case .camera:
|
}
|
||||||
CameraImagePicker(
|
}
|
||||||
isPresented: Binding(
|
.fullScreenCover(isPresented: $showCamera) {
|
||||||
get: { activeSheet == .camera },
|
CameraImagePicker { capturedImage in
|
||||||
set: { if !$0 { activeSheet = nil } }
|
if let jpegData = capturedImage.jpegData(compressionQuality: 0.8) {
|
||||||
)
|
imageData.append(jpegData)
|
||||||
) { capturedImage in
|
|
||||||
if let jpegData = capturedImage.jpegData(compressionQuality: 0.8) {
|
|
||||||
imageData.append(jpegData)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,19 +25,19 @@ struct AddEditProblemView: View {
|
|||||||
@State private var isEditing = false
|
@State private var isEditing = false
|
||||||
enum SheetType: Identifiable {
|
enum SheetType: Identifiable {
|
||||||
case photoOptions
|
case photoOptions
|
||||||
case camera
|
|
||||||
|
|
||||||
var id: Int {
|
var id: Int {
|
||||||
switch self {
|
switch self {
|
||||||
case .photoOptions: return 0
|
case .photoOptions: return 0
|
||||||
case .camera: return 1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@State private var activeSheet: SheetType?
|
@State private var activeSheet: SheetType?
|
||||||
|
@State private var showCamera = false
|
||||||
@State private var showPhotoPicker = false
|
@State private var showPhotoPicker = false
|
||||||
@State private var isPhotoPickerActionPending = false
|
@State private var isPhotoPickerActionPending = false
|
||||||
|
@State private var isCameraActionPending = false
|
||||||
|
|
||||||
private var existingProblem: Problem? {
|
private var existingProblem: Problem? {
|
||||||
guard let problemId = problemId else { return nil }
|
guard let problemId = problemId else { return nil }
|
||||||
@@ -120,6 +120,11 @@ struct AddEditProblemView: View {
|
|||||||
.sheet(
|
.sheet(
|
||||||
item: $activeSheet,
|
item: $activeSheet,
|
||||||
onDismiss: {
|
onDismiss: {
|
||||||
|
if isCameraActionPending {
|
||||||
|
showCamera = true
|
||||||
|
isCameraActionPending = false
|
||||||
|
return
|
||||||
|
}
|
||||||
if isPhotoPickerActionPending {
|
if isPhotoPickerActionPending {
|
||||||
showPhotoPicker = true
|
showPhotoPicker = true
|
||||||
isPhotoPickerActionPending = false
|
isPhotoPickerActionPending = false
|
||||||
@@ -133,7 +138,8 @@ struct AddEditProblemView: View {
|
|||||||
imageData: $imageData,
|
imageData: $imageData,
|
||||||
maxImages: 5,
|
maxImages: 5,
|
||||||
onCameraSelected: {
|
onCameraSelected: {
|
||||||
activeSheet = .camera
|
isCameraActionPending = true
|
||||||
|
activeSheet = nil
|
||||||
},
|
},
|
||||||
onPhotoLibrarySelected: {
|
onPhotoLibrarySelected: {
|
||||||
isPhotoPickerActionPending = true
|
isPhotoPickerActionPending = true
|
||||||
@@ -142,16 +148,12 @@ struct AddEditProblemView: View {
|
|||||||
activeSheet = nil
|
activeSheet = nil
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
case .camera:
|
}
|
||||||
CameraImagePicker(
|
}
|
||||||
isPresented: Binding(
|
.fullScreenCover(isPresented: $showCamera) {
|
||||||
get: { activeSheet == .camera },
|
CameraImagePicker { capturedImage in
|
||||||
set: { if !$0 { activeSheet = nil } }
|
if let jpegData = capturedImage.jpegData(compressionQuality: 0.8) {
|
||||||
)
|
imageData.append(jpegData)
|
||||||
) { capturedImage in
|
|
||||||
if let jpegData = capturedImage.jpegData(compressionQuality: 0.8) {
|
|
||||||
imageData.append(jpegData)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user