React-Native bottomTabNavigation mit großem Button in der Mitte
Ich möchte eine bottomTabNavigation wie folgt erstellen:
Ich habe es geschafft, eine solche tabNavigation zu erstellen, indem ich ein Bild eingefügt habe, position:'absolute'aber das Bild läuft über die Registerkarte und der Teil, der überläuft, ist nicht anklickbar.
Mein Code in diesem 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,
}
Dann habe ich mit der Requisite eine cust tabNavigation erstellt, tabBar={props => <CustomTabBar {...props} />}aber ich habe immer noch das gleiche Problem:
Das rote Quadrat ist eine berührbare Kapazität, aber nur der grüne Teil ist anklickbar. Der Teil über der Registerkarte ist immer noch nicht anklickbar und ich verstehe nicht warum ...
Haben Sie eine Idee, wie Sie einen so großen Button in der Mitte der bottomTabNavigation erstellen können?
Antworten
Ich glaube, ich habe es zum Laufen gebracht, indem ich eine benutzerdefinierte Registerkartenleiste erstellt und diese Komponente an die tabBarRequisite des Registerkartennavigators übergeben habe:
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,
},
});
Anschließend können Sie die CustomTabBar wie folgt an den Registerkartennavigator übergeben:
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>
);
};