레이아웃 측정하기
때로는 전체 레이아웃에 변경을 적용하거나 특정 로직을 호출하기 위해 현재 레이아웃을 측정해야 한다.
React Native는 뷰의 크기를 측정할 수 있는 네이티브 메서드를 제공한다. 이러한 메서드를 호출하는 가장 좋은 방법은 useLayoutEffect
훅을 사용하는 것이다. 이 훅은 측정된 가장 최신 값을 제공하며, 측정이 완료된 동일한 프레임 내에서 변경을 적용할 수 있게 한다.
일반적인 코드는 다음과 같다:
tsx
function AComponent(children) {
const targetRef = React.useRef(null)
useLayoutEffect(() => {
targetRef.current?.measure((x, y, width, height, pageX, pageY) => {
// 측정값을 활용해 작업 수행
});
}, [ /* 의존성 추가 */]);
return (
<View ref={targetRef}>
{children}
<View />
);
}
note
여기서 설명한 메서드는 React Native가 제공하는 대부분의 기본 컴포넌트에서 사용할 수 있다. 하지만 네이티브 뷰로 직접 지원되지 않는 합성 컴포넌트에서는 사용할 수 없다. 일반적으로 여러분이 직접 정의한 대부분의 컴포넌트는 여기에 해당한다.
measure(callback)
주어진 뷰의 화면 상 위치(x
, y
), 너비
, 높이
를 뷰포트 기준으로 측정한다. 측정된 값은 비동기 콜백을 통해 반환된다. 측정이 성공하면 콜백은 다음과 같은 인자와 함께 호출된다:
x
: 측정된 뷰의 원점(왼쪽 상단 모서리)의x
좌표(뷰포트 기준)y
: 측정된 뷰의 원점(왼쪽 상단 모서리)의y
좌표(뷰포트 기준)width
: 뷰의너비
height
: 뷰의높이
pageX
: 뷰의x
좌표(뷰포트 기준, 일반적으로 전체 화면)pageY
: 뷰의y
좌표(뷰포트 기준, 일반적으로 전체 화면)
measure()
가 반환하는 width
와 height
는 뷰포트 내 컴포넌트의 실제 너비
와 높이
이다.
measureInWindow(callback)
주어진 뷰의 윈도우 내 위치(x
와 y
)를 결정하고, 비동기 콜백을 통해 값을 반환한다. React 루트 뷰가 다른 네이티브 뷰에 포함된 경우, 이 메서드는 절대 좌표를 제공한다. 성공하면 콜백은 다음과 같은 인자와 함께 호출된다:
x
: 현재 윈도우 내 뷰의x
좌표y
: 현재 윈도우 내 뷰의y
좌표width
: 뷰의 너비height
: 뷰의 높이