This is probably my favorite navigation pattern on Android, I wish it were more common on iOS! This is a very simple JavaScript-only implementation of it for React Native. For more information about how the animations behind this work, check out the Rebound section of the React Native Animation Guide
- Run
npm install react-native-scrollable-tab-view --save var ScrollableTabView = require('react-native-scrollable-tab-view');
varScrollableTabView=require('react-native-scrollable-tab-view');varApp=React.createClass({render(){return(<ScrollableTabView><ReactPagetabLabel="React"/><FlowPagetabLabel="Flow"/><JestPagetabLabel="Jest"/></ScrollableTabView>);}}Suppose we had a custom tab bar called CustomTabBar, we would inject
it into our ScrollableTabView like this:
varScrollableTabView=require('react-native-scrollable-tab-view');varCustomTabBar=require('./CustomTabBar');varApp=React.createClass({render(){return(<ScrollableTabViewrenderTabBar={()=><CustomTabBarsomeProp={'here'}/>}><ReactPagetabLabel="React"/><FlowPagetabLabel="Flow"/><JestPagetabLabel="Jest"/></ScrollableTabView>);}}Below is the default tab bar, renamed to CustomTabBar, you can use this as a template for implementing your own.
varReact=require('react-native');var{
StyleSheet,
Text,
View,
TouchableOpacity,}=React;vardeviceWidth=require('Dimensions').get('window').width;varprecomputeStyle=require('precomputeStyle');varTAB_UNDERLINE_REF='TAB_UNDERLINE';varstyles=StyleSheet.create({tab: {flex: 1,alignItems: 'center',justifyContent: 'center',paddingBottom: 10,},tabs: {height: 50,flexDirection: 'row',marginTop: 20,borderWidth: 1,borderTopWidth: 0,borderLeftWidth: 0,borderRightWidth: 0,borderBottomColor: '#ccc',},});varCustomTabBar=React.createClass({propTypes: {goToPage: React.PropTypes.func,activeTab: React.PropTypes.number,tabs: React.PropTypes.array},renderTabOption(name,page){varisTabActive=this.props.activeTab===page;return(<TouchableOpacitykey={name}onPress={()=>this.props.goToPage(page)}><Viewstyle={[styles.tab]}><Textstyle={{color: isTabActive ? 'navy' : 'black',fontWeight: isTabActive ? 'bold' : 'normal'}}>{name}</Text></View></TouchableOpacity>);},setAnimationValue(value){this.refs[TAB_UNDERLINE_REF].setNativeProps(precomputeStyle({left: (deviceWidth*value)/this.props.tabs.length}));},render(){varnumberOfTabs=this.props.tabs.length;vartabUnderlineStyle={position: 'absolute',width: deviceWidth/numberOfTabs,height: 4,backgroundColor: 'navy',bottom: 0,};return(<Viewstyle={styles.tabs}>{this.props.tabs.map((tab,i)=>this.renderTabOption(tab,i))}<Viewstyle={tabUnderlineStyle}ref={TAB_UNDERLINE_REF}/></View>);},});module.exports=CustomTabBar;renderTabBar(Function:ReactComponent) - should return a component to use as the tab bar. The component hasgoToPage,tabs,activeTabandrefadded to the props, and should implementsetAnimationValueto be able to animate itself along with the tab content.onChangeTab(Function) - function to call when tab changes, should accept 1 argument which is an Object containing two keys:i: the index of the tab that is selected,ref: the ref of the tab that is selectededgeHitWidth(Integer) - region (in pixels) from the left & right edges of the screen that can trigger swipe. Default is 30, which is the same as the swipe-back gesture on iOS.hasTouch(Function) - returnstruewhen ScrollableTabView starts being panned andfalsewhen it is released. Not triggered whenlocked(Bool) is true.locked(Bool) - dynamically disable scrolling between tabs.springTension(Integer) - a number between1and100, controls the amount of tension on the spring that guides the scroll animation - see example.springFriction(Integer) - a number between1and30, controls the amount of friction on the spring that guides the scroll animation - see example.clampSpring(Bool) - iftrue, the spring will not bounce at all - iffalse, it will oscillate around the target value before settling.children(ReactComponents) - each top-level child component should have atabLabelprop that can be used by the tab bar component to render out the labels. The default tab bar expects it to be a string, but you can use anything you want if you make a custom tab bar.
MIT Licensed

