如何使用 React Navigation 创建像这样的中间选项卡按钮?

Posted

技术标签:

【中文标题】如何使用 React Navigation 创建像这样的中间选项卡按钮?【英文标题】:How can I create a middle tab button like these with React Navigation? 【发布时间】:2022-01-03 00:09:18 【问题描述】:

我需要像这样使用 React Navigation (v6) 创建一个底部标签导航:

到目前为止,我所做的是:

import * as React from 'react';
import  Text, View  from 'react-native';
import  NavigationContainer  from '@react-navigation/native';
import  createBottomTabNavigator  from '@react-navigation/bottom-tabs';

function HomeScreen() 
  return (
    <View style= flex: 1, justifyContent: 'center', alignItems: 'center' >
      <Text>Home!</Text>
    </View>
  );


function SettingsScreen() 
  return (
    <View style= flex: 1, justifyContent: 'center', alignItems: 'center' >
      <Text>Settings!</Text>
    </View>
  );


const Tab = createBottomTabNavigator();

export default function App() 
  return (
    <NavigationContainer>
      <Tab.Navigator>
        <Tab.Screen name="ForYou" component=ForYouScreen />
        <Tab.Screen name="Maps" component=MapsScreen />
        <Tab.Screen name="Premium" component=PremiumScreen />
        <Tab.Screen name="Shop" component=ShopScreen />
        <Tab.Screen name="Media" component=MediaScreen />
      </Tab.Navigator>
    </NavigationContainer>
  );

但我不确定样式的正确方法,我应该尝试以某种方式设置第三个标签按钮的样式吗?或者我应该创建一个 4 个选项卡导航并在中间创建一个浮动按钮,但在这种情况下,如何在中间的选项卡中为其创建空间?

任何想法或 sn-p 表示赞赏。

【问题讨论】:

【参考方案1】:

你可以做的是添加一个自定义 tabBarButton 并像这样在其中使用 svg(你需要安装 react-native-svg)

 //background svg which will create space
 const TabBg = ( color = '#FFFFFF', ...props ) => 
  return (
    <Svg width=75 height=61 viewBox="0 0 75 61" ...props>
      <Path
        d="M75.2 0v61H0V0c4.1 0 7.4 3.1 7.9 7.1C10 21.7 22.5 33 37.7 33c15.2 0 27.7-11.3 29.7-25.9.5-4 3.9-7.1 7.9-7.1h-.1z"
        fill=color
      />
    </Svg>
  );
;

//custom tabBarButton
const TabBarAdvancedButton = ( bgColor, ...props ) => 
  return (
    <View style=styles.container pointerEvents="box-none">
      <TabBg color=bgColor style=styles.background />
      <TouchableOpacity
        style=styles.button
        onPress=props.onPress>
        // any image or icon here
      </TouchableOpacity>
    </View>
  );
;
const styles = StyleSheet.create(
container: 
    position: 'relative',
    width: 75,
    alignItems: 'center'
  ,
  background: 
    position: 'absolute',
    top: 0,
  ,
  button: 
    top: -22.5,
    justifyContent: 'center',
    alignItems: 'center',
    width: 50,
    height: 50,
    borderRadius: 27,
    backgroundColor: '#E94F37',
  ,
  buttonIcon: 
    fontSize: 16,
    color: '#F6F7EB'
  
);



// add your custom tabBarButton component
<Tab.Screen
 name="Premium"
  component=PremiumScreen
  options=
    tabBarButton: (props) => (
      <TabBarAdvancedButton
        bgColor=barColor // background space color.
        ...props
      />
    )
  
/>

如果您需要更多帮助,您可以按照您想要的方式进行自定义,您可以按照下面提到的文章进行操作。这适用于 react-navigation v6。

ReactNative: TabBar With Float Button

【讨论】:

欢迎来到 SO!感谢您提供答案!但是,仅链接的答案通常被认为是不充分/不完整的,因为如果链接在未来某个时候发生变化或损坏,它们可能会变得无用。您能否更新此帖子以包含更多详细信息,以便在链接遭到破坏时仍然有价值?如果不是,则此内容更适合作为评论而不是作为答案... 感谢您的告知。我完全明白。但是,我需要 50 个代表才能发表评论,这就是我将其发布为答案的原因,我应该删除此答案吗? 我认为以目前的形式,它可能不会被视为一个完整的答案,并且可能会被关闭。因此,您可以删除它,您可以更新答案并将链接中的一些细节带入您的答案中,也许 OP 会投票并将其标记为完整为你赢得一些声誉:) 当然是你的选择。编码愉快!

以上是关于如何使用 React Navigation 创建像这样的中间选项卡按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中使用 react-navigation 的 withNavigation?

如何使用 react-navigation 推送新场景?

React-native-navigation 选项卡栏中心圆圈图标

如何从react-navigation获取主题类型(Typescript)

如何删除 React Navigation 5 中每个选项卡屏幕的标题?

React-navigation:与身份验证的深度链接