私のアプリ用にネストされたナビゲータを実装しようとしています。 アプリの構造はとてもシンプルです。ネストされたナビゲータの特定の画面にあるときに親TabNavigatorのスワイプを無効にする
RootNavigation(TabNavigator):
- Camera
- HomeNavigation (TabNavigator)
- MessagesList
したがって、アプリはデフォルトではHomeNavigation
で表示されます。左にスワイプしてCamera
を入力し、右にスクロールしてMessagesList
にスワイプします。 HomeNavigation
は、さらに次のように分割され
は今:このナビゲータで
HomeNavigation (TabNavigator):
- News Feed List
- NotificationsList
- Search News
、News Feed List
はデフォルトで表示されます。今私がNotificationsList
またはSearch News
にHome Navigation
を入力したとき。左または右にスワイプすると、私は欲しくないCamera
とMessagesList
になります。私はNews Feed List
にいるときだけこの機能が必要です。今私はドキュメントを読んでいたが、RootNavigation (Parent Navigator) from inside the child
でスワイプを無効にする方法をかなり理解できなかった。開発段階の後半では、News Feed List
はStackNavigator
に変換され、ユーザーは各ニュース項目を選択して詳細に読むことができます。私はまた、NewsFeedList
で深く進むと無効にしたいと思っています。
たぶん、このコードは、より良い私の状況を理解するのに役立ちます:
HomeNavigationConfigurtation:
const homeNavigationConfiguration = {
TabOneNavigation: {
screen: FeedScreen,
navigationOptions: {
tabBarLabel: 'Home',
tabBarIcon: ({ tintColor, focused }) => {
return (
<Ionicons
name={focused ? 'ios-home' : 'ios-home-outline'}
size={30}
style={{ color: tintColor }}
/>
);
}
}
},
TabTwoNavigation: {
screen: SearchTab,
navigationOptions: {
tabBarLabel: 'Search',
tabBarIcon: ({ tintColor, focused }) => {
return (
<Ionicons
name={focused ? 'ios-search' : 'ios-search-outline'}
size={30}
style={{ color: tintColor }}
/>
);
}
}
},
TabThreeNavigation: {
screen: NotificationTab,
navigationOptions: {
tabBarLabel: 'Notify',
tabBarIcon: ({ tintColor, focused }) => {
return (
<Ionicons
name={focused ? 'ios-list' : 'ios-list-outline'}
size={30}
style={{ color: tintColor }}
/>
);
}
}
}
};
const tabBarConfiguration = {
//...other configs
tabBarComponent: TabBarBottom,
tabBarPosition: 'bottom',
swipeEnabled: false,
animationEnabled: false,
lazy: true,
tabBarOptions: {
showIcon: true,
showLabel: false,
activeTintColor: '#347FC4',
inactiveTintColor: '#929AA1',
activeBackgroundColor: '#FFF',
inactiveBackgroundColor: '#FFF'
}
};
export const HomeNavConfiguration = TabNavigator(routeConfiguration, tabBarConfiguration);
HomeNavigation:
class HomeNavigationextends Component {
render() {
const { dispatch, navigationState } = this.props;
return (
<HomeNavigationConfiguration
navigation={
addNavigationHelpers({
dispatch,
state: navigationState,
})
}
/>
);
}
}
const mapStateToProps = (state) => {
return {
navigationState: state.homeNavState,
};
};
export default connect(mapStateToProps)(HomeNavigation);
HomeNavigationReducer:
export default (state, action) => {
if (action.type === 'JUMP_TO_TAB') {
return { ...state, index: 0 };
}
return HomeNAvigationConfig.router.getStateForAction(action, state);
};
RootNavigationConfiguration:
const routeConfiguration = {
RootNavigationScreenLeft: {
screen: CameraScreen,
navigationOptions: {
tabBarVisible: false
}
},
RootNavigationScreenMiddle: {
screen: RootTab,
navigationOptions: {
tabBarVisible: false
}
},
RootNavigationScreenRight: {
screen: MessagesListScreen,
navigationOptions: {
tabBarVisible: false
}
}
};
const tabBarConfiguration = {
//...other configs
swipeEnabled: true,
animationEnabled: true,
lazy: true,
initialRouteName: 'RootNavigationScreenMiddle'
};
export const RootNavigationConfig = TabNavigator(routeConfiguration, tabBarConfiguration);
ルートナビゲーション
class RootNavigationextends React.Component {
render() {
const { dispatch, navigationState } = this.props;
return (
<RootNavigationConfig
navigation={
addNavigationHelpers({
dispatch,
state: navigationState,
})
}
/>
);
}
}
const mapStateToProps = (state) => {
return {
navigationState: state.rootNavState,
};
};
export default connect(mapStateToProps)(RootNavigation);
任意のソリューションやアドバイスが高く評価されます。 :)
StackNavigatorを使用している場合、RootNavigationのCameraおよびMessagesListにアクセスするために左右にスワイプするオプションが失われませんか? –
○あります。しかし、それはたぶんクリーンなUXデザインのための提案(スタックとタブナビゲータを混ぜること)に過ぎませんでした。あなたがまだすべての画面の間をスワイプしたいのであれば、TabNavigatorの下にある5つの画面をすべてシンプルに囲まないのはなぜですか? 'HomeNavigation'の分類は重複しているようです。 – Rodiwa
さて、私はまずそれを行い、次にStackNavigatorをRootNavigationとして保存しましたが、左右にスワイプすると同じ作業をするボタンよりも良いように見えましたので、RootNavigationをTabNavigatorとして変更しました。あなたがカメラが入ってくるのを見ると、より良いアニメーションが得られました。 –