Почему элементы в TabBar на Expo и React Native не выравниваются по центру?

Как правильно настроить стиль вкладки табов в React Navigation, чтобы расположить элементы по центру с заданной высотой?
  • 16 апреля 2025 г. 13:45
Ответы на вопрос 2
Чтобы элементы в TabBar на Expo и React Native выравнивались по центру, нужно правильно настроить стили вкладок в React Navigation. В частности, вы можете использовать кастомный компонент для отображения вашей нижней навигации и применить к нему нужные стили.

Вот пример, как это можно сделать.

### Шаг 1: Установка необходимых пакетов

Убедитесь, что у вас установлены все необходимые пакеты для навигации:

```bash
npm install @react-navigation/native @react-navigation/bottom-tabs
npm install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
```

### Шаг 2: Настройка навигации

Создайте ваш `TabNavigator` и кастомный компонент для TabBar. Пример:

```jsx
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';

const Tab = createBottomTabNavigator();

function HomeScreen() {
  return (
    <View style={styles.container}>
      <Text>Home Screen</Text>
    </View>
  );
}

function SettingsScreen() {
  return (
    <View style={styles.container}>
      <Text>Settings Screen</Text>
    </View>
  );
}

// Кастомный компонент для TabBar
const CustomTabBar = ({ state, descriptors, navigation }) => {
  return (
    <View style={styles.tabBar}>
      {state.routes.map((route, index) => {
        const { options } = descriptors[route.key];
        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);
          }
        };

        return (
          <View key={index} style={styles.tabItem}>
            <Text onPress={onPress} style={{ color: isFocused ? '#673ab7' : '#222' }}>
              {options.tabBarLabel !== undefined ? options.tabBarLabel : options.title}
            </Text>
          </View>
        );
      })}
    </View>
  );
};

export default function App() {
  return (
    <NavigationContainer>
      <Tab.Navigator tabBar={props => <CustomTabBar {...props} />}>
        <Tab.Screen name="Home" component={HomeScreen} />
        <Tab.Screen name="Settings" component={SettingsScreen} />
      </Tab.Navigator>
    </NavigationContainer>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  tabBar: {
    flexDirection: 'row',
    justifyContent: 'space-around',
    alignItems: 'center',
    height: 60,
    backgroundColor: '#fff',
    elevation: 2,  // или используйте shadow для iOS
  },
  tabItem: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```

### Шаг 3: Настройка стилей

В приведенном примере свойства стилей в `tabBar` обеспечивают, что элементы вкладок выравниваются по центру за счет `flexDirection: 'row'`, `justifyContent: 'space-around'`, и `alignItems: 'center'`. Убедитесь, что высота вашего `tabBar` задана в 60 пикселей (или любое другое значение, которое вам нужно).

### Заключение

Таким образом, вы можете создать кастомный TabBar в React Navigation, позволяя вам контролировать стили и выравнивание элементов. Не забудьте изменить стили в соответствии с вашими требованиями, чтобы получать нужный вам вид.
Вызови DevTools, используй element inspector, выбери элемент, посмотри что не так - исправь.
Похожие вопросы