Animate Height
Animate changes in variable height. You can see a video of this example here.
import React, { ComponentProps, useReducer, useState } from 'react'
import { View as MotiView } from 'moti'
import { Button, View } from 'react-native'
function useLayout() {
  const [layout, setLayout] = useState({
    height: 0,
  })
  const onLayout: ComponentProps<typeof View>['onLayout'] = ({
    nativeEvent,
  }) => {
    setLayout(nativeEvent.layout)
  }
  return [layout, onLayout] as const
}
function Measure() {
  const [{ height }, onLayout] = useLayout()
  const [open, toggle] = useReducer((s) => !s, false)
  return (
    <>
      <MotiView animate={{ height }} style={{ overflow: 'hidden' }}>
        <View
          onLayout={onLayout}
          style={{ height: open ? 100 : 300, backgroundColor: 'green' }}
        />
      </MotiView>
      <Button title="toggle" onPress={toggle} />
    </>
  )
}
export default function App() {
  return (
    <View style={{ justifyContent: 'center', flex: 1 }}>
      <Measure />
    </View>
  )
}