Как по нажатию кнопки открыть камеру в swiftUI?

В Swift есть несколько способов открытия камеры при нажатии кнопки в SwiftUI. Рассмотрим два наиболее часто используемых способа.

1. Использование UIImagePickerController:
- Сначала вам потребуется импортировать UIKit в ваш проект: import UIKit
- Создайте структуру или класс, представляющий представление, содержащее кнопку, которая открывает камеру.
- Добавьте @State переменную, которая будет отслеживать состояние отображения камеры.
- В теле представления создайте функцию, которая отвечает за открытие камеры и обрабатывает результат.
- Внутри функции создайте экземпляр UIImagePickerController, установите его свойства и делегата.
- Перед открытием камеры проверьте, доступна ли камера на устройстве. Если она недоступна, выведите сообщение об ошибке.
- При закрытии камеры вызовите функцию, которая будет обрабатывать полученное изображение.
- Используйте модификатор sheet для отображения UIImagePickerController.

Вот пример кода:

   import SwiftUI
   import UIKit

   struct ContentView: View {
       @State private var showCamera = false

       var body: some View {
           Button(action: {
               self.showCamera = true
           }) {
               Text("Открыть камеру")
           }
           .sheet(isPresented: $showCamera) {
               MyCameraView(isShown: self.$showCamera)
           }
       }
   }

   struct MyCameraView: UIViewControllerRepresentable {
       @Binding var isShown: Bool

       class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
           @Binding var isShown: Bool

           init(isShown: Binding<Bool>) {
               _isShown = isShown
           }

           func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
               // Закрыть камеру
               isShown = false
               
               // Получить изображение
               guard let image = info[.originalImage] as? UIImage else {
                   return
               }
               
               // Обработать изображение
               // ...
           }

           func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
               // Закрыть камеру
               isShown = false
           }
       }

       func makeCoordinator() -> Coordinator {
           return Coordinator(isShown: $isShown)
       }

       func makeUIViewController(context: UIViewControllerRepresentableContext<MyCameraView>) -> UIImagePickerController {
           let picker = UIImagePickerController()
           picker.sourceType = .camera
           picker.delegate = context.coordinator
           return picker
       }

       func updateUIViewController(_ uiViewController: UIImagePickerController,context: UIViewControllerRepresentableContext<MyCameraView>) {
           // Do nothing
       }
   }

Обратите внимание, что этот код представляет лишь основу открытия камеры и обработки полученного изображения. Вам нужно будет добавить обработку возможных ошибок и дополнительные действия внутри соответствующих методов.

2. Использование AVFoundation:
- Сначала вам потребуется импортировать AVFoundation: import AVFoundation
- Создайте структуру или класс, представляющий представление, содержащее кнопку, которая открывает камеру.
- Добавьте @State переменные для отслеживания состояния отображения камеры.
- Внутри тела представления создайте функцию, которая запускает медиа-захват, включая камеру.
- Включите предварительное просмотр внутри функции.
- Воспользуйтесь модификатором .onAppear, чтобы вызвать функцию при открытии представления.
- Используйте AVFoundation для обработки захваченных изображений.

Вот пример кода:

   import SwiftUI
   import AVFoundation

   struct ContentView: View {
       @State private var showCamera = false
       @State private var image: Image?

       var body: some View {
           VStack {
               Button(action: {
                   self.showCamera = true
               }) {
                   Text("Открыть камеру")
               }
               image?.resizable().scaledToFit()
           }
           .sheet(isPresented: $showCamera) {
               MyCameraView(isShown: self.$showCamera, image: self.$image)
           }
       }
   }

   struct MyCameraView: View {
       @Binding var isShown: Bool
       @Binding var image: Image?
       @State private var showingImagePicker = false

       var body: some View {
           VStack {
               if image != nil {
                   image?.resizable().scaledToFit()
               } else {
                   Text("Нет изображения")
               }
           }
           .onAppear {
               self.showingImagePicker = true
           }
           .sheet(isPresented: $showingImagePicker, onDismiss: loadImage) {
               ImagePicker(image: self.$image, isShown: self.$showingImagePicker)
           }
           .navigationBarItems(trailing: Button("Готово") {
               self.isShown = false
           })
       }

       func loadImage() {
           guard let inputImage = image else {
               return
           }

           // Обработать изображение
           // ...
       }
   }

   struct ImagePicker: UIViewControllerRepresentable {
       @Binding var image: Image?
       @Binding var isShown: Bool

       func makeCoordinator() -> Coordinator {
           Coordinator(self)
       }

       func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
           let picker = UIImagePickerController()
           picker.delegate = context.coordinator
           return picker
       }

       func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
           // Do nothing
       }

       class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
           let parent: ImagePicker

           init(_ parent: ImagePicker) {
               self.parent = parent
           }

           func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
               if let uiImage = info[.originalImage] as? UIImage {
                   parent.image = Image(uiImage: uiImage)
               }

               parent.isShown = false
           }
       }
   }

Этот код представляет основу работы с камерой и обработки полученного изображения. По аналогии с первым примером, вам нужно будет добавить обработку ошибок и выполнить дополнительные действия по обработке полученных изображений.

Оба примера представляют собой базовую структуру, которую вы можете настроить и доработать в соответствии с вашими потребностями и требованиями проекта.