11import * as React from 'react' ;
2- import { findNodeHandle , LayoutChangeEvent , UIManager } from 'react-native' ;
2+ import {
3+ findNodeHandle ,
4+ LayoutChangeEvent ,
5+ LayoutRectangle ,
6+ UIManager ,
7+ } from 'react-native' ;
38
49export interface Measurements {
510 height : number ;
@@ -14,12 +19,14 @@ export interface RefMeasureChildrenProps {
1419 measurements : Measurements ;
1520 forwardRef : React . RefObject < any > ;
1621 onLayout : ( e : LayoutChangeEvent ) => void ;
22+ measure : ( layout ?: LayoutRectangle ) => void ;
1723}
1824export type RefMeasureRenderPropType = (
1925 props : RefMeasureChildrenProps ,
2026) => React . ReactNode ;
2127
2228export interface RefMeasureProps {
29+ onMeasure ?: ( props : Measurements ) => void ;
2330 children : RefMeasureRenderPropType ;
2431}
2532
@@ -43,30 +50,43 @@ class RefMeasure extends React.Component<RefMeasureProps, Measurements> {
4350 } ;
4451 }
4552
53+ public handleLayout = ( e : LayoutChangeEvent ) => {
54+ // Use the value from here, isntead of inside UIManager.measure callback
55+ // Async behavior will nullify nativeEvent
56+ const layout = e . nativeEvent . layout ;
57+ this . handleMeasure ( layout ) ;
58+ } ;
59+
60+ public handleMeasure = ( layout ?: LayoutRectangle ) => {
61+ const { onMeasure } = this . props ;
62+
63+ UIManager . measure (
64+ findNodeHandle ( this . container . current ) ! ,
65+ ( x , y , width , height , pageX , pageY ) => {
66+ const nodeMeasurements = {
67+ ...this . state ,
68+ ...layout ,
69+ pageX,
70+ pageY,
71+ } ;
72+
73+ if ( onMeasure ) {
74+ onMeasure ( nodeMeasurements ) ;
75+ }
76+ this . setState ( ( ) => nodeMeasurements ) ;
77+ } ,
78+ ) ;
79+ } ;
80+
4681 public render ( ) {
4782 const { children } = this . props ;
4883 const measurements = this . state ;
4984
5085 return children ( {
5186 forwardRef : this . container ,
87+ measure : this . handleMeasure ,
5288 measurements,
53- onLayout : e => {
54- // Use the value from here, isntead of inside UIManager.measure callback
55- // Async behavior will nullify nativeEvent
56- const layout = e . nativeEvent . layout ;
57-
58- UIManager . measure (
59- findNodeHandle ( this . container . current ) ! ,
60- ( x , y , width , height , pageX , pageY ) => {
61- const nodeMeasurements = {
62- ...layout ,
63- pageX,
64- pageY,
65- } ;
66- this . setState ( ( ) => nodeMeasurements ) ;
67- } ,
68- ) ;
69- } ,
89+ onLayout : this . handleLayout ,
7090 } ) ;
7191 }
7292}
0 commit comments