SwiftUIカメラをカスタム! UIをいじる方法について(途中で書く気無くなった!)
カメラのUIをいじることができない問題を調査した!
失敗事例を紹介した後にいい感じの実装法を紹介します!
UIImagePickerController (失敗)
UIImagePickerControllerを使いカメラ機能を作る
let viewController = UIImagePickerController()
viewController.sourceType = UIImagePickerController.SourceType.camera
viewController.cameraCaptureMode = UIImagePickerController.CameraCaptureMode.photo
viewController.showsCameraControls = false
viewController.allowsEditing = true
viewController.modalPresentationStyle = .fullScreen
viewController.sourceType
sourceTypeは、画像を選択するとき、または利用可能なメディアタイプを決定するときに使用します。
今回の場合は、SourceType.cameraとして画像ピッカーコントローラーのソースをデバイスの内蔵カメラを指定します。
cameraCaptureMode
カメラが指定するキャプチャモードを指定できます。
- photo
- video
showsCameraControls
画像ピッカーがデフォルトのカメラコントロールを表示するかどうかを示すブール値です。
viewController.showsCameraControls = false
にしていることで画像のように黒くなる。
true | false |
---|---|
allowsEditing
ユーザーが選択した静止画またはムービーを編集できるかどうかを示すブール値です。
modalPresentationStyle
ViewControllerのモーダル表示を指定する。
いっぱいあるから公式ドキュメント見て!
cameraOverlayView
let viewController = UIImagePickerController()
viewController.sourceType = UIImagePickerController.SourceType.camera
viewController.cameraCaptureMode = UIImagePickerController.CameraCaptureMode.photo
//ここ
viewController.cameraOverlayView = UIHostingController(rootView: NextContentView()).view
viewController.showsCameraControls = false
viewController.allowsEditing = true
viewController.modalPresentationStyle = .fullScreen
cameraOverlayViewを使うことでSwiftUIで作ったViewを被せることができます。
しかし、画像のように黒い謎の物体が下部にある状態になります。
また、なぜかSwiftUIで作ったViewのTextが表示されないことがあります。
SwiftUIで作ったView | デバイスでの表示 |
---|---|
UIImagePickerControllerの失敗理由
黒い物体が消せない
ARView (失敗)
struct ARView: UIViewRepresentable {
typealias UIViewType = ARSCNView
func makeUIView(context: Context) -> ARSCNView {
let arView = ARSCNView()
arView.frame = CGRect(x: 200, y: 500, width: 700, height: 200)
return arView
}
func updateUIView(_ uiView: ARSCNView, context: Context) {
let configuration = ARWorldTrackingConfiguration()
uiView.session.run(configuration)
}
}
このようにUIViewControllerRepresentableを使用してARSCNViewをSwiftUIで使えるようにする。
そして、SwiftUIのbodyの中に記述する。
var body: some View {
ARView()
}
UIの作成
任意のUIを被せたい場合はoverlayを使います。
var body: some View {
ARView()
.overlay {
任意のView
}
}
SwiftUIで作ったView | デバイスでの表示 |
---|---|
このようにUIとしてはうまくいっています。
しかし、
写真を撮る際に.overlayまで映ってしまいます。
また、ZStackやVStackすると謎の余白ができる。
ARViewの失敗理由
ARViewなので写真を撮る機能がなくsnapshotで撮るとoverlay部分も入る。
ZStackやVStackすると謎の余白ができて消えない。
Discussion