React-Native bottomTabNavigation avec gros bouton au milieu
Je veux créer un bottomTabNavigation comme ceci:
J'ai réussi à créer un onglet de navigation comme celui-ci en mettant une image position:'absolute'mais l'image déborde de l'onglet et la partie qui déborde n'est pas cliquable.
Mon code en ce moment:
<Tab.Navigator initialRouteName="Activity" tabBarOptions={{
showIcon: true,
showLabel: false,
activeTintColor: 'blue',
}}>
<Tab.Screen name="Theme" component={Themes} options={{
tabBarIcon: () => (<Image source={require('../Images/list_blue.png')} style={styles.icon}/>)
}}/>
<Tab.Screen name="Activity" component={Activity} options={{
tabBarIcon: () => (<Image source={require('../Images/idea_blue.png')} style={styles.main_icon}/>)
}}/>
<Tab.Screen name="Add" component={Add} options={{
tabBarIcon: () => (<Image source={require('../Images/plus_blue.png') style={styles.icon}/>)
}}/>
</Tab.Navigator>
//Styles
icon: {
width: 40,
height: 40,
},
main_icon: {
position: 'absolute',
bottom: -30,
width: 115,
height: 115,
}
Ensuite, j'ai créé un onglet custNavigation avec l'accessoire tabBar={props => <CustomTabBar {...props} />}mais j'ai toujours le même problème:
le carré rouge est une opacité touchable mais seule la partie verte en cliquable, la partie au dessus de l'onglet n'est toujours pas cliquable et je ne comprends pas pourquoi ...
Avez-vous une idée comment créer un si gros bouton au milieu du bottomTabNavigation?
Réponses
Je pense que je l'ai fait fonctionner en créant une barre d'onglets personnalisée et en passant ce composant à l' tabBaraccessoire du navigateur d'onglets:
function CustomTabBar({ state, descriptors, navigation, position }) {
return (
<View
style={{
flexDirection: 'row',
height: 50,
alignItems: 'center',
justifyContent: 'space-around',
}}>
{state.routes.map((route, index) => {
const { options } = descriptors[route.key];
const label =
options.tabBarLabel !== undefined
? options.tabBarLabel
: options.title !== undefined
? options.title
: route.name;
const isFocused = state.index === index;
const onPress = () => {
const event = navigation.emit({
type: 'tabPress',
target: route.key,
canPreventDefault: true,
});
if (!isFocused && !event.defaultPrevented) {
navigation.navigate(route.name);
}
};
const onLongPress = () => {
navigation.emit({
type: 'tabLongPress',
target: route.key,
});
};
const inputRange = state.routes.map((_, i) => i);
return (
<TouchableOpacity
accessibilityRole="button"
accessibilityStates={isFocused ? ['selected'] : []}
accessibilityLabel={options.tabBarAccessibilityLabel}
testID={options.tabBarTestID}
onPress={onPress}
onLongPress={onLongPress}>
{route.name === 'Screen 2' ? (
<Image
style={styles.logo}
source={{ uri: 'https://reactnative.dev/img/tiny_logo.png' }}
/>
) : (
<Image
style={styles.logo_tiny}
source={{ uri: 'https://reactnative.dev/img/tiny_logo.png' }}
/>
)}
</TouchableOpacity>
);
})}
</View>
);
}
const styles = StyleSheet.create({
logo: {
width: 80,
height: 80,
bottom: 0,
},
logo_tiny: {
width: 30,
height: 30,
},
});
Ensuite, vous pouvez passer le CustomTabBar au navigateur d'onglets comme ceci:
const App = () => {
return (
<NavigationContainer>
<Tab.Navigator
initialRouteName="Activity"
tabBarOptions={{
showIcon: true,
showLabel: false,
activeTintColor: 'blue',
}}
tabBar={(props) => <CustomTabBar {...props} />}>
<Tab.Screen name="Screen 1" component={Screen1} />
<Tab.Screen name="Screen 2" component={Screen2} />
<Tab.Screen name="Screen 3" component={Screen3} />
</Tab.Navigator>
</NavigationContainer>
);
};