개발자

리액트 네이티브 스크롤 뷰 스크롤이 완전히 멈춘 경우를 핸들링하는 방법이 있을까요?

2023년 07월 18일조회 266

안녕하세요, RN으로 앱개발 중인 주니어 개발자입니다. 이번에 활성화 된 특정 범위로 이동시 그에 해당하는 날짜로 값을 설정하는 컴포넌트를 제작하고 있습니다. 예시를 들자면 아이폰의 갤러리의 영상 재생바와 유사합니다. 이를 위해 ScrollView에 horizontal 속성을 이용하여 변화하는 x값을 사용하여 진행 중 입니다. 다만, 이동이 완료된 뒤 해당 x값을 변환하여 상태를 변경하는 과정에서 막혀 도움을 얻고자 합니다. 손을 뗀 이후 스크롤이 완전히 멈춘 경우에 해당 값을 변경하고 싶은데, onScrollDragEnd 와 onMomentumScrollEnd 이 각각 손을 뗀 직후, 관성 스크롤이 생긴 뒤 종료된 경우의 이벤트로 사용되어 이에 어려움을 겪고있습니다. 혹시 위 두 이벤트를 이용하여 관성 스크롤이 생기던 생기지 않던 모든 스크롤이 멈춘 뒤 메소드를 실행 시킬 수 있는 방법이 있을까요? 혹은 ScrollView 를 대체하여 변화하는 x 좌표를 이용 할 수 있는 컴포넌트 / 라이브러리 / 키워드를 공유해주신다면 감사히 참고하겠습니다. 감사합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 4

손정현님의 프로필 사진

안녕하세요! RN의 기본 터치 시스템으로 네이티브의 세세한 조정까지 신경쓰기는 어려운걸로 알고 있습니다. 다행히 이런 문제점?은 예전부터 있어왔고 이를 해결하기 위한 라이브러리도 있어요. 좀 더 세세하게 네이티브 터치 시스템과 상호작용 할 수 있는 걸로 알고 있습니다. 물론 위 라이브러리가 구현하고자 하는 기능에 비해 과한 것 일 수 있으니 참고 정도만 해주시면 좋을 것 같아요 :) - https://docs.swmansion.com/react-native-gesture-handler/docs/

최경락님의 프로필 사진

최경락

작성자

FE2023년 07월 19일

매번 react-native 컴포넌트 불러올 때 눈치없이 불러와지는 라이브러리로만 알고있었는데.... 말씀주신 문서 참고해보겠습니다! 감사합니다!

이영준님의 프로필 사진

손을 떼고 관성이 시작되었는지 알면 되지 않을까요?

홍지성 (포포)님의 프로필 사진

스크롤 관련 이벤트에서 속도와 이동거리를 활용하여 원하는 상황을 정의할 수 있는지 판단해 보는 것도 좋을 것 같습니다.

커리어리 AI 봇님의 프로필 사진

React Native에서 스크롤 뷰 스크롤이 완전히 멈춘 경우를 핸들링하기 위해 다음과 같은 방법을 고려해볼 수 있습니다: 1. InteractionManager 사용: InteractionManager를 사용하면 스크롤 애니메이션 및 기타 상호 작용이 완료된 후에 작업을 수행할 수 있습니다. `InteractionManager.runAfterInteractions()` 함수를 사용하여 스크롤 관련 작업을 예약하고, 해당 작업이 실행되기 전에 모든 상호 작용이 완료될 때까지 기다릴 수 있습니다. 2. Animated 사용: Animated 라이브러리를 사용하여 스크롤 위치를 추적하고, 애니메이션 상태를 확인하여 스크롤이 완전히 멈춘 후에 작업을 수행할 수 있습니다. 위의 방법 중 하나를 선택하여 사용하시면, 스크롤이 완전히 멈춘 후에 원하는 작업을 수행할 수 있을 것입니다. 또한, 필요에 따라 애니메이션 라이브러리를 추가로 사용하여 세부적인 애니메이션 효과를 구현할 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#1
import { InteractionManager } from 'react-native';

// 스크롤이 완전히 멈춘 후 실행되어야 할 작업
const handleScrollEnd = () => {
  // 작업 실행
};

// 스크롤 이벤트 핸들러
const handleScroll = () => {
  // 스크롤 중인 동안 실행되는 작업
};

const handleScrollEndWithDelay = () => {
  InteractionManager.runAfterInteractions(() => {
    handleScrollEnd();
  });
};

// ScrollView 컴포넌트
<ScrollView
  onScroll={handleScroll}
  onScrollEndDrag={handleScrollEndWithDelay}
>
  {/* 컨텐츠 */}
</ScrollView>


#2
import { Animated } from 'react-native';

// Animated.Value 사용하여 x 위치 추적
const scrollX = new Animated.Value(0);

// 스크롤 중인 동안 실행되는 작업
const handleScroll = Animated.event(
  [{ nativeEvent: { contentOffset: { x: scrollX } } }],
  { useNativeDriver: true }
);

// 스크롤이 완전히 멈춘 후 실행되어야 할 작업
const handleScrollEnd = () => {
  // 작업 실행
};

// Animated.event로부터 생성된 핸들러를 사용하여 스크롤 이벤트 처리
<ScrollView
  onScroll={handleScroll}
  onMomentumScrollEnd={handleScrollEnd}
>
  {/* 컨텐츠 */}
</ScrollView>

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!