GithubHelp home page GithubHelp logo

Comments (15)

rogchap avatar rogchap commented on May 14, 2024 6

I wrote a custom NavigationBar so that I could hide/show per route, but also animate it too... it was very quickly "penned" so it's unlikely to be solid, but it might point you in the right direction:

// CustomNavBar.js
import React, { Navigator, View, Animated, StyleSheet } from 'react-native';

var COMPONENT_NAMES = ['Title', 'LeftButton', 'RightButton'];

export default class extends Navigator.NavigationBar {
  constructor(props: any) {
    super(props);
    this._shouldHideNavBar = this._shouldHideNavBar.bind(this);
    let { navState } = props;
    const route = navState.routeStack[navState.presentedIndex];
    this.state = {
      heightValue: new Animated.Value(
        !route.hideNavBar ?
        props.navigationStyles.General.TotalNavHeight : 0),
    };
  }

  componentDidMount() {
    setImmediate(this._shouldHideNavBar);
  }

  componentDidUpdate() {
    setImmediate(this._shouldHideNavBar);
  }

  render(): View {
    var navBarStyle = {
        height: this.state.heightValue,
        overflow: 'hidden',
      };
    var navState = this.props.navState;
    var components = navState.routeStack.map((route, index) =>
      COMPONENT_NAMES.map(componentName =>
        this._getComponent(componentName, route, index)
      )
    );

    return (
      <Animated.View
        key={this._key}
        style={[styles.navBarContainer, navBarStyle, this.props.style]}>
        {components}
      </Animated.View>
    );
  }

  _shouldHideNavBar() {
    let { navState } = this.props;
    const route = navState.routeStack[navState.presentedIndex];
    Animated.timing(this.state.heightValue, {
      duration: 250,
      toValue: !route.hideNavBar ? this.props.navigationStyles.General.TotalNavHeight : 0,
    }).start();
  }
}

var styles = StyleSheet.create({
  navBarContainer: {
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    backgroundColor: 'transparent',
  },
});

Usage:

// Render somewhere
<ExNavigator
          navigator={navigator}
          initialRoute={Router.getMyRoute()}
          renderNavigationBar={props => <CustomNavBar {...props} />}

// Route somewhere
getMyRoute() {
    return {
      getSceneClass() {
        return MyScreen;
      },

      hideNavBar: true,
    };
  },

Hope this might help

from ex-navigator.

despairblue avatar despairblue commented on May 14, 2024 2

With #19 it's possible to override showNavigationBar on the route level:

{
  showNavigationBar: false,

  getSceneClass() {
    return require('./HomeScene');
  },

  getTitle() {
    return 'Home';
  },
};

from ex-navigator.

joshuapinter avatar joshuapinter commented on May 14, 2024 1

Thanks @rogchap, works great!

A note to others, make sure to import your CustomNavBar like so:

import CustomNavBar from './CustomNavBar';

from ex-navigator.

melihmucuk avatar melihmucuk commented on May 14, 2024

+1

from ex-navigator.

ide avatar ide commented on May 14, 2024

I haven't tested this but you could try re-rendering the ExNavigator with a different value for the navigationBarStyle prop (set the height to 0. may also need to hide overflow). Let me know how it goes.

from ex-navigator.

jesseruder avatar jesseruder commented on May 14, 2024

This isn't ideal but you can also use two ExNavigators. The parent one can have showNavigationBar set to false and then the first route can be wrapped in another ExNavigator with the navigation bar visible. Then instead of this.props.navigator.push use this.props.navigator.parentNavigator.push.

from ex-navigator.

sercanov avatar sercanov commented on May 14, 2024

Uh.. Actually I found another workaround. Just changed the color of navigator to my parent view and returned empty string to title. The navigation bar and its height is physically there but it works for my UI.

A feature to do that could be useful btw.

Thanks anyway

from ex-navigator.

cjbell avatar cjbell commented on May 14, 2024

@ide height to 0 with hidden overflow works.

Would be really nice if there was a way that the route could declare whether it wanted to hide the navigation bar 👍

from ex-navigator.

despairblue avatar despairblue commented on May 14, 2024

I tried to implement it in two different ways, but neither worked and I'm stuck. It seems two react issues are blocking this. I opened two PR here and linked the issues. I'd appreciate a second pair of eyes, maybe I'm missing something:

from ex-navigator.

ide avatar ide commented on May 14, 2024

@cjbell ExNavigator should accomodate many different ways to hide the nav bar (sliding out, fading, fading + sliding, not completely hiding) so I'd prefer to make that possible and let people write their own code (as @despairblue is doing -- except Navigator / ExNavigator don't make that easy to do quite yet). So we probably won't add a method like hideNavigationBar but do want to let you implement this yourself and if it's something lots of people use, you could publish it as a mixin or helper lib.

from ex-navigator.

alexcurtis avatar alexcurtis commented on May 14, 2024

Does this work in 0.3.0 release?. I've tried to add showNavigationBar: false into my route, but its still showing up.

from ex-navigator.

ide avatar ide commented on May 14, 2024

@alexcurtis showNavigationBar isn't supported on routes because we don't yet have an API. It might involve adding a second scene config field that controls the nav bar's animation but we haven't thought about it much.

from ex-navigator.

jawadrehman avatar jawadrehman commented on May 14, 2024

how do i rerender exnavigator with different values for the navigationBarStyle prop when using a new route ? @ide

from ex-navigator.

ide avatar ide commented on May 14, 2024

@jawadrehman That's not supported right now -- you'll have to look through the code to see how to write a custom NavigationBar implementation.

from ex-navigator.

jasonwiener avatar jasonwiener commented on May 14, 2024

@rogchap you, sir, are a champion!

from ex-navigator.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.