From 43b447e5f4345bd6c3a6957cb5aa1587324799e8 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Feb 2024 06:20:41 +0000 Subject: [PATCH] Fix layout calculations (#2816) --- src/view/com/pager/PagerWithHeader.tsx | 42 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/view/com/pager/PagerWithHeader.tsx b/src/view/com/pager/PagerWithHeader.tsx index 31abc1ab..dcfc616c 100644 --- a/src/view/com/pager/PagerWithHeader.tsx +++ b/src/view/com/pager/PagerWithHeader.tsx @@ -68,15 +68,12 @@ export const PagerWithHeader = React.forwardRef( setTabBarHeight(Math.round(height)) } }) - const onHeaderOnlyLayout = useNonReactiveCallback( - (evt: LayoutChangeEvent) => { - const height = evt.nativeEvent.layout.height - if (height > 0 && isHeaderReady) { - // The rounding is necessary to prevent jumps on iOS - setHeaderOnlyHeight(Math.round(height)) - } - }, - ) + const onHeaderOnlyLayout = useNonReactiveCallback((height: number) => { + if (height > 0) { + // The rounding is necessary to prevent jumps on iOS + setHeaderOnlyHeight(Math.round(height)) + } + }) const renderTabBar = React.useCallback( (props: RenderTabBarFnProps) => { @@ -224,7 +221,7 @@ let PagerTabBar = ({ testID?: string scrollY: SharedValue renderHeader?: () => JSX.Element - onHeaderOnlyLayout: (e: LayoutChangeEvent) => void + onHeaderOnlyLayout: (height: number) => void onTabBarLayout: (e: LayoutChangeEvent) => void onCurrentPageSelected?: (index: number) => void onSelect?: (index: number) => void @@ -236,11 +233,34 @@ let PagerTabBar = ({ }, ], })) + const headerRef = React.useRef(null) + React.useEffect(() => { + // Fire when layout *becomes* ready. + // We can't rely on onLayout alone because it won't fire if layout is the same. + // We can't rely on this effect alone because it won't fire if layout changes later. + if (isHeaderReady) { + // @ts-ignore + headerRef.current!.measure( + (_x: number, _y: number, _width: number, height: number) => { + onHeaderOnlyLayout(height) + }, + ) + } + }, [isHeaderReady, onHeaderOnlyLayout]) + return ( - + { + if (isHeaderReady) { + onHeaderOnlyLayout(e.nativeEvent.layout.height) + } + }}> {renderHeader?.()}