본문 바로가기

리액트 네이티브

리액트 네이티브 튜토리얼 기능 구현2 - Component

1편에서 만든 TutorialProvider에 사용된 Tutorial 컴포넌트를 만들어 보겠습니다.

 

Tutorial 컴포넌트의 형태입니다. HoleInfo 타입은 1편 마지막 부분을 참조해 주세요.

우선 4개의 훅이 사용됩니다. DescriptionPosition 타입은 1편 마지막 부분을 참조해 주세요.

HoleView는 한 번에 여러개의 구멍을 표시할 수 있습니다. 하지만 저는 한 번에 한 개의 구멍이 터치할 때마다 이동하는 UI를 구현하였습니다. 그래서 holes는 항상 요소가 1개인 배열입니다.

 

firstHole는 매개값으로 입력되는 holes에서 첫번째 요소의 x, y 좌표에서 사이즈만 0으로 변경한 더미 값입니다. 처음에 구멍을 표시할 때 점점 커지는 효과를 넣기 위해서 만들었습니다. 마지막에 전체 코드에서 확인할 수 있습니다.

 

그리고 descriptionText와 descriptionPosition은 텍스트와 텍스트의 위치를 조절하기 위해 사용됩니다. 매개값으로 입력되는 HoleInfo 추출할 수 있습니다.

 

다음은 구멍과 텍스트를 변경하는 함수입니다. 매개변수로 전달된 holes(HoleInfo[])에서 꺼낸 아이템(HoleInfo)을 입력합니다. 튜토리얼을 시작할 때, 터치할 때, 마지막으로 터치할 때 로직이 다르지만, 이 부분은 동일하기 때문에, 중복을 방지하기 위해서 따로 함수를 만들었습니다.

iOS에서는 setHoles와 다른 훅을 동시에 실행하면 애니메이션이 작동하지 않는 문제가 발생해서 25ms의 딜레이를 주었습니다.

 

튜토리얼이 시작할 때 실행되는 훅과 튜토리얼을 터치했을 때 실행하는 함수입니다.
index.current !== lastIndex일 때는 안드로이드에서 추가 코드가 있지만 생략했습니다. 안드로이드에서추가 코드를 실행시켜주지 않으면 구멍이 작아질 때, borderRadius가 이상해 지더라구요. 아래 전체코드에서 확인할 수 있습니다.

처음에 언급했다시피 사이즈가 0인 firstHole에서 hole[0]으로 변경하면 첫 번째 구멍이 점점 커지면서 나타나게 됩니다.

 

마지막 인덱스에서 터치하게 되면 마지막 아이템의 x, y 좌표에 사이즈만 0인 lastHole을 새로 만들어줍니다. 그리고 튜토리얼 Context로 부터 전달받은 onLastPress 함수를 실행시킵니다. 여기에는 Tutorial 컴포넌트를 제거하는 코드가 포함되어 있습니다. (1편 전체코드 참조)

 

마지막으로 안드로이드에서 뒤로가기 버튼을 금지해 줍니다.

다음은 랜더링 부분입니다.

react-native-hole-view 제작자가 iOS와 안드로이드에서 HoleView를 터치했을 때 결과가 다르다고 했기 때문에 애초에 외부에서 HoleView를 제어했습니다. 

TouchableWithoutFeedback은 한 개의 View 컴포넌트만 받을 수 있기 때문에 HoleView를 더미 컴포넌트인 Container로 감쌌습니다.

 

컴포넌트는 styled-components를 사용해서 만들었습니다.

전체코드