10. Componente StatusBar
Tutorial: Componente StatusBar en React Native
📱 Parte 10: Componente StatusBar - Control Total de la Barra de Estado
🎯 Objetivo:
Aprender a usar el componente StatusBar de React Native para controlar la apariencia y comportamiento de la barra de estado en dispositivos iOS y Android.
📸 Introducción a StatusBar
1.1 ¿Qué es la StatusBar?
La StatusBar es la barra superior que muestra información del sistema:
text
┌─────────────────────────────────┐
│ 📶 5:28 PM 🔋 84% │ ← ¡ESTA ES LA STATUSBAR
crea un tutorial con el tema: 10. Componente StatusBar en react native
Tutorial: Componente StatusBar en React Native
📱 Parte 10: Componente StatusBar - Control Total de la Barra de Estado
🎯 Objetivo:
Aprender a usar el componente StatusBar de React Native para controlar la apariencia y comportamiento de la barra de estado en dispositivos iOS y Android.
📸 Introducción a StatusBar
1.1 ¿Qué es la StatusBar?
La StatusBar es la barra superior que muestra información del sistema:
text
┌─────────────────────────────────┐
│ 📶 5:28 PM 🔋 84% │ ← ¡ESTA ES LA STATUSBAR!
│ │
│ TU APLICACIÓN │
│ │
│ │
│ │
└─────────────────────────────────┘
Elementos típicos de la StatusBar:
⏰ Hora actual
📶 Indicador de señal
🔋 Nivel de batería
📡 Iconos de conexión (Wi-Fi, datos móviles)
🔔 Notificaciones pendientes
1.2 ¿Por qué es importante controlarla?
Consistencia visual con el diseño de tu app
Legibilidad del contenido
Experiencia de usuario mejorada
Compatibilidad con diferentes dispositivos
📦 Paso 1: Importación y Uso Básico
1.1 Importar el Componente
javascript
import React from 'react';
import { StatusBar, View, Text, StyleSheet } from 'react-native';
1.2 Uso Más Simple
javascript
const AppBasica = () => {
return (
<View style={styles.container}>
<StatusBar />
<Text>Mi Aplicación</Text>
</View>
);
};
🎨 Paso 2: Propiedades Principales de StatusBar
2.1 Control de Apariencia (barStyle)
javascript
const App = () => {
return (
<View style={styles.container}>
{/* Barra de estado con texto oscuro */}
<StatusBar barStyle="dark-content" />
<Text>Texto oscuro en StatusBar</Text>
</View>
);
};
Opciones de barStyle:
"default" - Por defecto (depende del sistema)
"light-content" - Texto blanco ⭐
"dark-content" - Texto negro ⭐
2.2 Color de Fondo (backgroundColor) - Solo Android
javascript
<StatusBar
barStyle="light-content"
backgroundColor="#6200ee" // ⚠️ Solo funciona en Android
/>
2.3 Control de Visibilidad
javascript
<StatusBar
hidden={true} // Oculta la StatusBar
/>
📱 Paso 3: Diferencias entre iOS y Android
3.1 Ejemplo con Plataformas Específicas
javascript
import { Platform, StatusBar } from 'react-native';
const App = () => {
return (
<View style={styles.container}>
<StatusBar
// Configuración específica por plataforma
barStyle={Platform.OS === 'ios' ? 'dark-content' : 'light-content'}
backgroundColor={Platform.OS === 'android' ? '#6200ee' : 'transparent'}
translucent={Platform.OS === 'android'} // Solo Android
/>
<Text>App con StatusBar optimizada</Text>
</View>
);
};
3.2 Tabla de Compatibilidad
🎯 Paso 4: Ejemplos Prácticos Comunes
4.1 Pantalla de Login con StatusBar Clara
javascript
const LoginScreen = () => {
return (
<View style={styles.loginContainer}>
{/* StatusBar con texto blanco sobre fondo de imagen */}
<StatusBar
barStyle="light-content"
translucent={true} // Android: StatusBar transparente
backgroundColor="transparent"
/>
<Image
source={require('./background.jpg')}
style={StyleSheet.absoluteFillObject}
/>
<Text style={styles.loginTitle}>Iniciar Sesión</Text>
{/* Resto del formulario */}
</View>
);
};
4.2 Pantalla con Header de Color
javascript
const HomeScreen = () => {
return (
<View style={styles.container}>
{/* StatusBar que combina con el header */}
<StatusBar
barStyle="light-content"
backgroundColor="#1976d2" // Mismo color que el header
/>
{/* Header */}
<View style={styles.header}>
<Text style={styles.headerTitle}>Mi App</Text>
</View>
{/* Contenido */}
<View style={styles.content}>
<Text>Contenido principal</Text>
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
header: {
height: 60,
backgroundColor: '#1976d2',
justifyContent: 'center',
alignItems: 'center',
},
headerTitle: {
color: 'white',
fontSize: 20,
fontWeight: 'bold',
},
content: {
flex: 1,
padding: 20,
},
});
4.3 StatusBar Dinámica (Cambia con Scroll)
javascript
import React, { useState } from 'react';
import { ScrollView, StatusBar, Text, View } from 'react-native';
const DynamicStatusBarScreen = () => {
const [isScrolled, setIsScrolled] = useState(false);
const handleScroll = (event) => {
const offsetY = event.nativeEvent.contentOffset.y;
setIsScrolled(offsetY > 50);
};
return (
<View style={{ flex: 1 }}>
{/* StatusBar que cambia al hacer scroll */}
<StatusBar
barStyle={isScrolled ? 'dark-content' : 'light-content'}
backgroundColor={isScrolled ? 'white' : 'transparent'}
animated={true}
/>
<ScrollView
onScroll={handleScroll}
scrollEventThrottle={16}
>
{/* Contenido largo */}
{Array.from({ length: 50 }).map((_, index) => (
<Text key={index} style={{ padding: 20 }}>
Elemento {index + 1}
</Text>
))}
</ScrollView>
</View>
);
};
⚡ Paso 5: StatusBar API (Métodos Estáticos)
5.1 Métodos Disponibles
javascript
import { StatusBar } from 'react-native';
// Cambiar propiedades dinámicamente
StatusBar.setBarStyle('light-content', true); // animated
StatusBar.setBackgroundColor('#000000', true); // Android only
StatusBar.setHidden(true, 'fade'); // 'none', 'fade', 'slide'
StatusBar.setTranslucent(true); // Android only
5.2 Ejemplo: Cambiar StatusBar en Diferentes Pantallas
javascript
import React, { useEffect } from 'react';
import { StatusBar, View } from 'react-native';
const ProfileScreen = () => {
useEffect(() => {
// Al montar la pantalla
StatusBar.setBarStyle('dark-content', true);
// Al desmontar la pantalla
return () => {
StatusBar.setBarStyle('light-content', true);
};
}, []);
return (
<View style={{ flex: 1 }}>
<Text>Perfil del Usuario</Text>
</View>
);
};
5.3 Obtener Valores Actuales
javascript
// Consultar valores actuales
const currentHeight = StatusBar.currentHeight; // Solo Android
console.log('Altura de StatusBar:', currentHeight);
🔧 Paso 6: Combinación con SafeAreaView
6.1 Ejemplo Completo con Ambos Componentes
javascript
import React from 'react';
import { SafeAreaView, StatusBar, View, Text } from 'react-native';
const AppCompleta = () => {
return (
<>
<StatusBar
barStyle="light-content"
backgroundColor="#6200ee"
/>
<SafeAreaView style={{ flex: 1, backgroundColor: '#6200ee' }}>
{/* Header dentro del SafeArea */}
<View style={{ padding: 20 }}>
<Text style={{ color: 'white', fontSize: 24 }}>
Mi Aplicación
</Text>
</View>
{/* Contenido principal */}
<View style={{
flex: 1,
backgroundColor: 'white',
borderTopLeftRadius: 20,
borderTopRightRadius: 20,
padding: 20
}}>
<Text>Contenido principal aquí</Text>
</View>
</SafeAreaView>
</>
);
};
6.2 Manejo de Alturas en Android
javascript
import { Platform, StatusBar } from 'react-native';
const getStatusBarHeight = () => {
if (Platform.OS === 'android') {
return StatusBar.currentHeight || 0;
}
return 0; // iOS maneja esto automáticamente con SafeAreaView
};
const App = () => {
const statusBarHeight = getStatusBarHeight();
return (
<View style={{ flex: 1 }}>
<StatusBar backgroundColor="#6200ee" />
{/* Espacio para la StatusBar en Android */}
{Platform.OS === 'android' && (
<View style={{ height: statusBarHeight, backgroundColor: '#6200ee' }} />
)}
{/* Resto de la app */}
<Text>Contenido</Text>
</View>
);
};
📊 Paso 7: Casos de Uso Avanzados
7.1 StatusBar en Navegación entre Pantallas
javascript
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { StatusBar } from 'react-native';
const Stack = createStackNavigator();
const App = () => {
return (
<>
<StatusBar
barStyle="dark-content"
backgroundColor="transparent"
translucent={true}
/>
<NavigationContainer>
<Stack.Navigator
screenOptions={{
headerStyle: {
backgroundColor: '#fff',
elevation: 0, // Android
shadowOpacity: 0, // iOS
},
headerTintColor: '#000',
}}
>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen
name="Details"
component={DetailsScreen}
options={{
headerTransparent: true,
headerTintColor: '#fff',
}}
/>
</Stack.Navigator>
</NavigationContainer>
</>
);
};
7.2 StatusBar para Modo Oscuro/Claro
javascript
import React, { useState } from 'react';
import { StatusBar, Switch, View, Text } from 'react-native';
const ThemeToggleScreen = () => {
const [isDarkMode, setIsDarkMode] = useState(false);
return (
<View style={{
flex: 1,
backgroundColor: isDarkMode ? '#121212' : '#ffffff',
}}>
<StatusBar
barStyle={isDarkMode ? 'light-content' : 'dark-content'}
backgroundColor={isDarkMode ? '#121212' : '#ffffff'}
/>
<View style={{ padding: 20 }}>
<Text style={{
color: isDarkMode ? '#ffffff' : '#000000',
fontSize: 24,
marginBottom: 20
}}>
Modo {isDarkMode ? 'Oscuro' : 'Claro'}
</Text>
<Switch
value={isDarkMode}
onValueChange={setIsDarkMode}
/>
</View>
</View>
);
};
7.3 StatusBar con Animaciones
javascript
import React, { useRef } from 'react';
import { Animated, StatusBar, Button } from 'react-native';
const AnimatedStatusBar = () => {
const fadeAnim = useRef(new Animated.Value(0)).current;
const fadeInStatusBar = () => {
StatusBar.setHidden(false, 'fade');
};
const fadeOutStatusBar = () => {
StatusBar.setHidden(true, 'fade');
};
const slideInStatusBar = () => {
StatusBar.setHidden(false, 'slide');
};
return (
<View style={{ flex: 1, padding: 20 }}>
<StatusBar
barStyle="dark-content"
animated={true}
/>
<Button title="Mostrar (Fade)" onPress={fadeInStatusBar} />
<Button title="Ocultar (Fade)" onPress={fadeOutStatusBar} />
<Button title="Mostrar (Slide)" onPress={slideInStatusBar} />
</View>
);
};
⚠️ Paso 8: Problemas Comunes y Soluciones
❌ Problema 1: StatusBar no se ve en iOS
Solución:
javascript
// iOS necesita SafeAreaView para manejar correctamente la StatusBar
<>
<StatusBar barStyle="dark-content" />
<SafeAreaView style={{ flex: 1, backgroundColor: '#fff' }}>
<Text>Contenido</Text>
</SafeAreaView>
</>
❌ Problema 2: Color no cambia en iOS
Solución:
javascript
// iOS no soporta backgroundColor directamente
<StatusBar
barStyle="light-content"
translucent={false}
/>
// Luego usa un View con el color deseado
<View style={{
height: Platform.OS === 'ios' ? 44 : StatusBar.currentHeight,
backgroundColor: 'tu-color'
}} />
❌ Problema 3: Contenido detrás de StatusBar en Android
Solución:
javascript
<>
<StatusBar translucent backgroundColor="transparent" />
<View style={{
flex: 1,
paddingTop: Platform.OS === 'android' ? StatusBar.currentHeight : 0
}}>
<Text>Contenido</Text>
</View>
</>
📋 Paso 9: Mejores Prácticas
9.1 Checklist para StatusBar
Testear en iOS y Android por separado
Usar animated={true} para transiciones suaves
Combinar con SafeAreaView en iOS
Considerar el modo oscuro/claro del sistema
Manejar cambios de orientación (landscape/portrait)
9.2 Código de Configuración Óptima
javascript
import { Platform, StatusBar } from 'react-native';
const configureStatusBar = () => {
if (Platform.OS === 'android') {
StatusBar.setTranslucent(true);
StatusBar.setBackgroundColor('transparent');
}
StatusBar.setBarStyle('light-content', true);
};
// Llamar al inicio de la app
configureStatusBar();
🎯 Ejercicio Práctico
Crea una aplicación con:
✅ Pantalla de inicio con StatusBar clara sobre imagen
✅ Pantalla de perfil con StatusBar oscura
✅ Botón para alternar visibilidad de StatusBar con animación
✅ Header que cambia color junto con la StatusBar
Bonus: Implementa detección automática de modo oscuro/claro del sistema.
📚 Resumen de Propiedades
🎬 Próximo Tutorial
En el siguiente video aprenderemos:
Componente Image y ImageBackground
Carga de imágenes locales y remotas
Optimización de imágenes
Efectos y estilos en imágenes
✅ ¡Ahora dominas el control completo de la StatusBar! Recuerda que una StatusBar bien configurada mejora significativamente la experiencia de usuario y la apariencia profesional de tu aplicación.
Comentarios
Publicar un comentario