Skip to content

React Navigation Extension for Collapsible Header. Make your header of react-navigation collapsible.

License

Notifications You must be signed in to change notification settings

FATMAP/react-navigation-collapsible

This branch is 101 commits behind benevbright/react-navigation-collapsible:main.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

9b6288f · Nov 24, 2019
Nov 24, 2019
Feb 3, 2019
Nov 24, 2019
Aug 3, 2018
Aug 3, 2018
Oct 20, 2018
Sep 1, 2018
Aug 20, 2018
Nov 24, 2019
Nov 24, 2019
Feb 3, 2019
Feb 3, 2019
Nov 24, 2019
Nov 24, 2019

Repository files navigation

react-navigation-collapsible

npm npm Greenkeeper badge

React Navigation Extension for Collapsible Header. Make your header of react-navigation collapsible.

Try Expo Snack

Try Example.

cd example
yarn
yarn ios
yarn android

Usage

react-navigation v2?

If you're using react-navigation v2, please use [email protected] and 2.0.0 README.

Expo

If you use Expo, add this lines to your App.js. (It only affects Android)

/* Support Expo */
import {setExpoStatusBarHeight} from 'react-navigation-collapsible';
import Constants from 'expo-constants';

setExpoStatusBarHeight(Constants.statusBarHeight);

Default Header

(MyScreen.js)

import React, {Component} from 'react';
import {withCollapsible} from 'react-navigation-collapsible';
const AnimatedFlatList = Animated.createAnimatedComponent(FlatList);

class MyScreen extends Component {
  static navigationOptions = {
    title: 'My Screen',
  };

  render() {
    const {paddingHeight, animatedY, onScroll} = this.props.collapsible;

    return (
      <AnimatedFlatList
        //...
        contentContainerStyle={{paddingTop: paddingHeight}}
        scrollIndicatorInsets={{top: paddingHeight}}
        _mustAddThis={animatedY}
        onScroll={onScroll}

        // if you want to use 'onScroll' callback.
        // onScroll={Animated.event(
        //   [{nativeEvent: {contentOffset: {y: animatedY}}}],
        //   {useNativeDriver:true, listener:this.onScroll})}
      />
    );
  }
}

export default withCollapsible(MyScreen, {iOSCollapsedColor: '#031'});

See example/src/S0_DefaultHeader.js

Extra Header (Search Bar)

See example/src/S1_ExtraHeader.js

Default Header With Tab

See example/src/S2_DefaultHeaderForTab.js and example/src/TabChild1Screen.js

Extra Header With Tab (e.g Facebook Group)

See example/src/S3_ExtraHeaderForTab.js and example/src/TabChild1Screen.js

API

HoC and config method

type CollapsibleParams = {
  iOSCollapsedColor: string, // iOS only
} | {
  collapsibleComponent: React.Component,
  collapsibleBackgroundStyle: {
    ...React.Style
  } & {
    disableFadeoutInnerComponent?: boolean,
    paddingBottom?: number,
  }
}

function withCollapsible (WrappedScreen, collapsibleParams: CollapsibleParams = {})
function withCollapsibleForTab (MaterialTapNavigator, collapsibleParams: CollapsibleParams = {})
function withCollapsibleForTabChild (WrappedScreen)

function setExpoStatusBarHeight (height) // expo only
function setSafeBounceHeight (height)

Given props

render () {
  const {
    paddingHeight,
    translateY, // 0 ~ collapsibleHeaderHeight
    translateOpacity, // 1.0 ~ 0.0
    translateProgress, // 0.0 ~ 1.0
    animatedY,
    onScroll,
  } = this.props.collapsible;

  // ...
}

Limitation

When scroll slowly, the layout is flickering on Android.

This is react-native's regression bug on Android. Here is a workaround. facebook/react-native#15445 (comment)

With State persistence #40

react-navigation provides State persistence as experimental feature. Unfortunately, collapsible header stops collapsible when you use it.

With SectionList #37

ToDo

  • Hiding bottom tab

Contribution

  • PR is welcome. Please create issue or PR with a sample react-navigation code or Expo Snack.
  • If you've got good example using this module, please update /example.

Dependencies Version of Example

  • react-native: 0.61.4, latest: npm
  • react-navigation: 4.0.10, latest: npm

I've ensured this module is compatible with react-native >=0.56 and react-navigation >=2.11.2. But it does not mean it's not compatible with older versions.

About

React Navigation Extension for Collapsible Header. Make your header of react-navigation collapsible.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 71.1%
  • Objective-C 10.9%
  • Ruby 7.2%
  • Java 6.8%
  • Makefile 1.7%
  • Python 1.6%
  • TypeScript 0.7%