📸

SwiftUIでカメラ機能を使う

2024/02/27に公開

読んでほしい人

  • SwiftUIでカメラ機能を使ってみたい人
  • SwiftUIを勉強している人

補足情報

カメラ機能を使うだけで、保存機能はありません!
こちらの動画を参考にしましたが、どうやらコードの書き方が変わっているようです💦
全部で、12回あったかな...
https://www.youtube.com/watch?v=dKg12Wm8hBM

記事の内容

SwiftUIでカメラ機能を使ってみたいと思った。しかしどうやらUIKitの機能も使う必要があるらしい???
チュートリアル動画参考に、CameraView.swiftを作成して、カメラ機能を使うUIKitの構造体を作成する。動画の通りにやっても上手くいかないので、Github Copilotに修正してもらいました。

import SwiftUI

struct CameraView: UIViewControllerRepresentable {
    @Binding var image: UIImage
    @Binding var showingCamera: Bool
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<CameraView>) -> UIImagePickerController {
        let controller = UIImagePickerController()
        controller.sourceType = .camera
        controller.delegate = context.coordinator
        return controller
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<CameraView>) {
        
    }
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(parent: self)
    }
    
    class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        
        let parent: CameraView
        
        init(parent: CameraView) {
            self.parent = parent
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            let image = info[.originalImage] as! UIImage
            self.parent.image = image
            self.parent.showingCamera = false
        }
        
    }
}

ボタンを押すと、カメラを起動する設定をする。

import SwiftUI

struct ContentView: View {
    @State var image = UIImage()
    @State var showingCamera: Bool = false
    
    var body: some View {
        VStack {
            Image(uiImage: self.image)
                .resizable()
                .frame(width: 300, height: 150)
            
            Button(action: {
                // ボタンが押されたら、showingCameraがtrueになる
                showingCamera = true
            }, label: {
                Text("カメラを起動する")
            })
            // showingCameraがtrueの時に、sheetが表示される
            .sheet(isPresented: $showingCamera, content: {
                CameraView(image: $image, showingCamera: $showingCamera)
            })
        }
    }
}

#Preview {
    ContentView()
}

カメラを使うときに、接続がうまくいかないことがありましたが、何度かやってたらできました。謎だ...
error code

pair with the device in the xcode devices window, and respond to any pairing prompts on the device.

ネットの記事を参考にするがあまり参考にならなかった???
https://shibuya24.info/entry/unity-trouble-ios-build

以前だと、iOSのバージョンを下げればできるエラーだった。
https://zenn.dev/joo_hashi/articles/2142d8698e2209

これがスクリーンショット:





最後に

今回は、カメラを使うだけの機能ですがご紹介しました。カメラ機能を作るときにこれを改造して保存をする撮影機能を付けたいですね💦
UIKitの知識も必要なので、SwiftUIではiOS開発はできないので、覚えることが多くて大変ですね。

こちらの記事も参考になりそうです。
https://qiita.com/SNQ-2001/items/2cc6e7e35ab98ba02397

Discussion