Skip to content

never-better/SwiftUI-TCA-Camera-Demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

SwiftUI-TCA-Camera-Demo

SwiftUI Camera App Using TCA(Composable Architecture), AVFoundation (SwiftUI와 Swift-Composable-Architecture, AVFoundation을 사용한 카메라 데모 앱 입니다.)


SwiftUI-tca-camera-demo-play

기능

  • 전면 & 후면 카메라
  • 전면 <-> 후면 전환 시 애니메이션
  • 촬영 결과 확인 View

뷰 플로우

Frame 44

  1. 카메라 버튼 클릭
    dismiss 애니메이션을 on으로 초기화 함.
  2. 이동
    @PresentationStatefullScreenCover를 사용해 Content View -> Camera View 로 이동
  3. 촬영
    AVCaptureSession()을 사용해 preview를 보여주고 촬영함. 화면 전환 시 전면 <-> 후면 카메라 전환.
  4. 이동
    @PresentationStatefullScreenCover를 사용해 Camera View -> Camera Result View 로 이동
  5. 이미지 전달
    Save 버튼 클릭시 delegate를 사용해 부모 뷰인 Camera View로 이미지 전달. OR, Cancel 버튼 클릭시 Camera View로 다시 이동.
  6. 이미지 전달
    delegate를 사용해 부모 뷰인 Content View로 이미지 전달. 이 때 Camera View dismiss 애니메이션을 on 함. Camera Result View -> Content View로 한 번에 dismiss 하는 효과를 냄

기능 플로우

  • Camera
    • AVFoundationAVCaptureSession를 사용해 카메라, 비디오 preview 기능 사용.
    • AVCapturePhotoCaptureDelegateAVCaptureVideoDataOutputSampleBufferDelegate를 채택함. withCheckedContinuation를 사용해 delegate -> async로 값을 리턴함.
    • 프로젝트와 독립적
  • Camera Service
    • Camera <-> ComposableArchitecture 연결을 위한 브릿지. DependencyKey를 채택함.
  • CameraSetting
    • 카메라 비율, 줌 비율, 드롭 프레임 설정
    • 줌 비율(zoom Factor)의 시스템 기본 값은 1.0이다. 비율이 1.0 = 카메라의 0.5배율(광각) 이다. preview를 기본 배율(1.0배율)로 보여주기 위해 2배 설정해주었다.

카메라 시작

swiftUI-tca-camera-diagram-init

카메라 촬영

swiftUI-tca-camera-diagram-takeaphoto

전면 <-> 후면 전환

swiftUI-tca-camera-diagram-switch


코드

구현 시 특별 사항

  • preview 오류 해결을 위해 첫 6프레임을 드랍합니다. (오류는 아래 영상 참고).
    • 카메라 preview 시작시 0.5초 정도 preview가 90도 회전되서 나옵니다. 완전한 해결법은 아닌데 preview가 회전되서 오는 걸 인식하는 방법은 못 찾아 차선책으로 프레임을 드랍 중 입니다.
  • 화면 전환시 뒤집기(flip) 애니메이션을 위한 로직입니다. (조금 복잡해서 이해를 돕기위해 작성합니다)
    • switchButtonTapped action 전달
    • 애니메이션과 함께 flipDegreeUpdate action 전달 -> degree가 linear 하게 증가
    • flipImage를 현재 viewFinderImage 로 업데이트 & blur 처리
    • viewFinderImage 초기화
    • cameraServiceswitchCaptureDevice() async 실행
    • camera에서 switchCaptureDevice() async 실행 -> 이 때 dropFrame = 0으로 초기화
    • AVCaptureVideoDataOutputSampleBufferDelegatecaptureOutput메소드를 통해 preview를 받아옴. dropFrame이 목표(현재 6)에 달성되면 switchCaptureDevice()함수 종료 비동기 전달.
    • cameraFeature에서 switchCaptureDevice() 비동기 종료 확인. send(.flipImageRemove) 실행
    • flipImage = nil로 초기화 -> flipImage가 없어지므로 화면에 preview가 보여짐.

오류

  • preview 회전 오류 상황

레퍼런스

About

SwiftUI Camera App Using Composable Architecture

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages