게임시작하기 버튼을 탭하면 Game 화면 및 Game 결과대기 화면을 보여줍니다#7
Merged
Conversation
- CoordinatorProtocol 추가 - AppCoordinator 및 OnboardingCoordinator 타입 추가 - ViewModelAction 삭제하고, delegate 패턴을 적용 - 다크모드 지원하지 않으므로 View 내부 background를 white로 통일
- MainTabBar와 Setting 화면에도 Coordinator 패턴 적용 - SettingCoordinator와 OnboardingCoordinator를 DislikedFoodSurveyPresentable로 추상화
- GameCoordinator 추가하여 미니게임 시작 버튼을 탭하면 Game 화면이 보이도록 구현 - GameViewController, CardView 추가 - 세 장의 카드를 배치할 때 각 카드의 frame을 변경함
- '좋아요', '싫어요', '상관없음' 버튼에 따라 애니메이션 구현 - 각 버튼을 눌렀을 때 CardGameViewModel이 indecies를 올려줌
- 최근 제출한 답변을 삭제하고, 카드가 다시 나타나도록 함 - 첫 번째 질문에서는 이전버튼을 숨김 처리함
- YesOrNo Card와 MultipleChoice Card를 CardViewProtocol로 추상화
- 네트워크를 통해 게임결과를 서버에 제출하고, 제출인원수를 받아 레이블에 표시함 - SharePinNumberPage에서 생성된 PinNumber를 이후 화면의 ViewModel로 전달하여 레이블에 나타냄 - postableAPI의 Header로 Content-Type 추가 - 네트워크 API (게임결과 제출, 제출인원수 등) 추가
- SoloMenuCoordinator, HomeCoordinator, TogetherMenuCoordinator 추가
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배경
사용자가 Game을 통해 9가지 질문에 대답하는 기능을 구현했습니다.
질문은 Card 형태로 띄우고, 7개 질문은 버튼을 통한
좋아요/싫어요, 2개 질문은 CollectionView를 통한다중선택로 답변하도록 했습니다. 이때 사용자가 Game에 집중할 수 있도록 NavigationBar 및 TabBar가 숨겨지도록 했습니다.작업 내용
1. 전체적인 게임 애니메이션 구현
참고한 게임 애니메이션 링크
위 애니메이션처럼
답변 버튼을 탭하면 답변 종류 (좋아요, 싫어요, 상관 없음)에 따라 카드가 날아가고,이전 질문 버튼을 탭하면 카드가 날아간 방향에서 다시 돌아오도록 구현했습니다.카드는 별도의 Custom View 타입을 생성하여 구현했고, UI요소인 만큼
CardGameViewController가 가지고 있도록 했으며, 애니메이션을 위해CGRect로 위치를 잡았습니다. 따라서translatesAutoresizingMaskIntoConstraints를 true로 줬습니다.카드 위치의 경우 화면에 보이는 1, 2, 3번째 카드의 위치를 고정해두었고, 답변을 제출하거나, 이전 질문으로 되돌렸을 때 특정 카드의 위치를 바꿔주도록 했습니다.
카드가 제출되어 날라가는 경우
CGAffineTransform(translateX:y)와CGAffineTransform(rotationAngle:)을 사용했고, 카드가 다시 돌아오는 경우 날라갔던 위치를 기억하고 있었기 때문에CGAffineTransform(rotationAngle:)만 사용해서 다시 원래대로 돌아오도록 했습니다.2. TabBar마다 개별적인 Coordinator 및 NavigationController를 가지도록 구현
HIG 문서의
Tab bars내용 (They also let people quickly switch between sections of the view while preserving the current navigation state within each section.)과 같이TabBar 마다 독립적으로 화면이 작동하도록 해야 하므로 TabBarViewController를 띄우는
Coordinator및NavigationController(이하 부모 Coordinator 및 Navigation), 그리고 특정 TabBar 내부에서 화면을 이동하는Coordinator및NavigationController(이하 자식 Coordinator 및 Navigation)을 분리했습니다. 또한 부모 Coordinator 및 자식 Coordinator는Delegate Pattern을 활용하여 소통하도록 했습니다.Coordinator 구조는 아래와 같습니다.

사용자가 게임을 할 때 게임에 몰입할 수 있도록 Game 화면에서는
부모 Coordinator를 통해 NavigationBar 및 TabBar가 숨겨지도록 했고, 게임 대기/결과 화면에서 다시 보여지도록 구현했습니다.또한
자식 Coordinator에는 Game 화면에 필요한 별도의 Coordinator를 추가하여 코드 재사용성을 개선했습니다.3. 다중선택 게임의 CollectionView 구현
다중선택 게임의 경우 선택지가 고정적이고 Animation이 따로 필요하지 않았기에DiffableDataSource를 사용하지 않았습니다.대신
ComposiontalLayout을 통해 CollectionView의 레이아웃을 잡고, Rx의bind오퍼레이터를 통해 데이터를 넣어줬습니다.다중선택 게임의 경우 기존에는 다른 형태의 View로 넘어가서 게임을 진행하는 방식이었으나, 기존
Yes/No 게임처럼 카드 형태로 되어 있을 경우 게임이 얼마나 남았는지 시각적으로 파악할 수 있기 때문에 다중선택 게임 또한 카드 방식으로 구현했습니다.4. 결과 제출 버튼을 누르면 서버에 결과를 취합하여 전송하도록 구현
혼자메뉴결정,함께메뉴결정모두 마지막 질문에서 다음 버튼을 누르는 경우, 게임 답변을 서버에 전송하도록 구현했습니다.결과 전송 API의 경우 PIN번호가 있으면
함께메뉴결정, 없으면혼자메뉴결정에 해당하는 URL로 데이터를 Post 도록 했으며,httpMethod가 Post인 경우httpBody에 인코딩한 JSON 데이터를 넣도록 했습니다.5.
함께메뉴결정 탭의Game 결과대기 화면구현10초 Timer의 타이머를 통해 서버에서 제출인원수 (SubmissionCount)를 10초 간격으로 받아 화면에 나타내도록 했습니다. 따라서 얼마나 많은 인원이 제출을 했는지 확인이 가능하도록 했습니다.
Refresh 버튼을 만드는 방안도 고려했으나 이는 사용자가 계속해서 해당 버튼을 눌러줘야 하는 불편함이 있기에, 자동으로 갱신되도록 구현했습니다.
6.
게임 다시 시작 버튼구현함께메뉴결정 탭의Game 결과대기 화면에서게임 다시 시작 버튼을 탭하면, 서버에 제출한 개인 데이터를 삭제하고, 해당 탭의 초기화면으로 돌아가도록 구현했습니다.초기화면으로 돌아갈 때는 메모리 관리를 위해
부모 Coordinator의childCoordinators프로퍼티에서 기존의자식 Coordinator를 삭제하고, 새롭게 생성한자식 Coordinator를 추가하도록 했습니다.테스트 방법
리뷰 노트
스크린샷