SwiftUI Camera App Using TCA(Composable Architecture), AVFoundation (SwiftUI와 Swift-Composable-Architecture, AVFoundation을 사용한 카메라 데모 앱 입니다.)
- 전면 & 후면 카메라
- 전면 <-> 후면 전환 시 애니메이션
- 촬영 결과 확인 View
- 카메라 버튼 클릭
dismiss 애니메이션을 on으로 초기화 함. - 이동
@PresentationState
와fullScreenCover
를 사용해Content View
->Camera View
로 이동 - 촬영
AVCaptureSession()
을 사용해 preview를 보여주고 촬영함. 화면 전환 시 전면 <-> 후면 카메라 전환. - 이동
@PresentationState
와fullScreenCover
를 사용해Camera View
->Camera Result View
로 이동 - 이미지 전달
Save 버튼 클릭시delegate
를 사용해 부모 뷰인Camera View
로 이미지 전달. OR, Cancel 버튼 클릭시Camera View
로 다시 이동. - 이미지 전달
delegate
를 사용해 부모 뷰인Content View
로 이미지 전달. 이 때Camera View
dismiss 애니메이션을 on 함.Camera Result View
->Content View
로 한 번에 dismiss 하는 효과를 냄
- Camera
AVFoundation
의AVCaptureSession
를 사용해 카메라, 비디오 preview 기능 사용.AVCapturePhotoCaptureDelegate
와AVCaptureVideoDataOutputSampleBufferDelegate
를 채택함.withCheckedContinuation
를 사용해 delegate -> async로 값을 리턴함.- 프로젝트와 독립적
- Camera Service
Camera
<-> ComposableArchitecture 연결을 위한 브릿지.DependencyKey
를 채택함.
- CameraSetting
- 카메라 비율, 줌 비율, 드롭 프레임 설정
- 줌 비율(zoom Factor)의 시스템 기본 값은 1.0이다. 비율이 1.0 = 카메라의 0.5배율(광각) 이다. preview를 기본 배율(1.0배율)로 보여주기 위해 2배 설정해주었다.
- preview 오류 해결을 위해 첫 6프레임을 드랍합니다. (오류는 아래 영상 참고).
- 카메라 preview 시작시 0.5초 정도 preview가 90도 회전되서 나옵니다. 완전한 해결법은 아닌데 preview가 회전되서 오는 걸 인식하는 방법은 못 찾아 차선책으로 프레임을 드랍 중 입니다.
- 화면 전환시 뒤집기(flip) 애니메이션을 위한 로직입니다. (조금 복잡해서 이해를 돕기위해 작성합니다)
switchButtonTapped
action 전달- 애니메이션과 함께
flipDegreeUpdate
action 전달 -> degree가 linear 하게 증가 flipImage
를 현재viewFinderImage
로 업데이트 & blur 처리viewFinderImage
초기화cameraService
의switchCaptureDevice() async
실행camera
에서switchCaptureDevice() async
실행 -> 이 때dropFrame = 0
으로 초기화AVCaptureVideoDataOutputSampleBufferDelegate
의captureOutput
메소드를 통해 preview를 받아옴. dropFrame이 목표(현재 6)에 달성되면switchCaptureDevice()
함수 종료 비동기 전달.cameraFeature
에서switchCaptureDevice()
비동기 종료 확인.send(.flipImageRemove)
실행flipImage = nil
로 초기화 ->flipImage
가 없어지므로 화면에 preview가 보여짐.
- Swift UI Tutorial : https://developer.apple.com/tutorials/sample-apps/capturingphotos-camerapreview
- Swift Composable Architecture : https://github.com/pointfreeco/swift-composable-architecture