107 votes

Comment empêcher le chevauchement de la mise en page avec la barre d'état d'iOS ?

Je travaille sur tutoriel pour la navigation React Native. J'ai découvert que toutes les mises en page commencent à se charger depuis le haut de l'écran au lieu de se charger depuis le bas de la barre d'état. Cela entraîne un chevauchement de la plupart des mises en page avec la barre d'état. Je peux corriger cela en ajoutant un padding à la vue lors de son chargement. Est-ce la bonne façon de procéder ? Je ne pense pas que l'ajout manuel d'un renflement soit un moyen efficace de résoudre ce problème. Existe-t-il un moyen plus élégant de résoudre ce problème ?

import React, { Component } from 'react';
import { View, Text, Navigator } from 'react-native';

export default class MyScene extends Component {
    static get defaultProps() {
            return {
                    title : 'MyScene'    
            };  
    }   
    render() {
            return (
                    <View style={{padding: 20}}> //padding to prevent overlap
                            <Text>Hi! My name is {this.props.title}.</Text>
                    </View> 
            )   
    }    
}

Vous trouverez ci-dessous les captures d'écran avant et après l'ajout du rembourrage. enter image description here

16 votes

Bonne question, mais vous pourriez peut-être réduire les images.

0 votes

stackoverflow.com/a/39300715/1540350 <- cette réponse ne va pas seulement régler le problème mentionné ici, mais vous donnera même la possibilité de colorer le fond de la barre d'état dans iOS et Android.

78voto

Greg Ennis Points 3316

Vous pouvez maintenant utiliser SafeAreaView qui est inclus dans React Navigation :

<SafeAreaView>
    ... your content ...
</SafeAreaView>

4 votes

Il serait bon de noter que ce composant est inclus dans react-navigation maintenant par défaut.

34 votes

Cela ne résout pas le problème du chevauchement de la barre d'état - j'ai enveloppé mon application dans SafeAreaView et mon application chevauche toujours la barre d'état. Il semble que cette solution soit adaptée à l'encoche de l'iPhone X et aux coins arrondis.

1 votes

Vous n'enveloppez pas votre application dedans, vous enveloppez un écran dedans.

42voto

Luis Rizo Points 1096

Il existe un moyen très simple de résoudre ce problème. Créez un composant.

Vous pouvez créer un composant StatusBar et l'appeler après le premier wrapper de vue dans vos composants parents.

Voici le code de celui que j'utilise :

'use strict'
import React, {Component} from 'react';
import {View, Text, StyleSheet, Platform} from 'react-native';

class StatusBarBackground extends Component{
  render(){
    return(
      <View style={[styles.statusBarBackground, this.props.style || {}]}> //This part is just so you can change the color of the status bar from the parents by passing it as a prop
      </View>
    );
  }
}

const styles = StyleSheet.create({
  statusBarBackground: {
    height: (Platform.OS === 'ios') ? 18 : 0, //this is just to test if the platform is iOS to give it a height of 18, else, no height (Android apps have their own status bar)
    backgroundColor: "white",
  }

})

module.exports= StatusBarBackground

Après avoir fait cela et l'avoir exporté vers votre composant principal, appelez-le comme ceci :

import StatusBarBackground from './YourPath/StatusBarBackground'

export default class MyScene extends Component {
  render(){
    return(
      <View>
        <StatusBarBackground style={{backgroundColor:'midnightblue'}}/>
      </View>
    )
  }
}

0 votes

MidnightBlue est invalide, dit React Native : Avertissement : Type de prop non valide : Prop non valide backgroundColor fourni

2 votes

Il devrait être midnightblue .

24 votes

La barre d'état d'iOS n'a pas une taille fixe. Elle peut être plus grande lorsque vous partagez un réseau Wifi ou lorsque vous êtes en communication.

35voto

Gaurav Saluja Points 131

J'ai essayé une méthode plus simple pour cela.

Nous pouvons obtenir la hauteur de la barre d'état sur Android et utiliser SafeAreaView avec elle pour que le code fonctionne sur les deux plateformes.

import { SafeAreaView, StatusBar, Platform } from 'react-native';

Si nous nous déconnectons Platform.OS y StatusBar.currentHeight on obtient les journaux,

console.log('Height on: ', Platform.OS, StatusBar.currentHeight);

Hauteur sur : Android 24 et Hauteur sur : Android 24

Nous pouvons maintenant ajouter de manière facultative des marges et des renforts à notre vue conteneur en utilisant

paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0

Le code final dans App.js est ci-dessous :

export default class App extends React.Component {
  render() {
    return (
      <SafeAreaView style={{ flex: 1, backgroundColor: "#fff" }}>
        <View style={styles.container}>
          <Text>Hello World</Text>
        </View>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0
  }
});

1 votes

Je l'ai essayé sur Android et ça marche. Je ne peux pas encore le tester sur iOS, mais comme je sais ce qu'est la SafeArea sur iOS, je suis presque sûr que cela devrait fonctionner là aussi.

1 votes

*** Les autres solutions proposées ici fournissent des hauteurs fixes arbitraires basées sur leur propre situation de test unique.

2 votes

Une réponse parfaite mais SafeAreaView n'est pas applicable pour les appareils iPhone avec une version inférieure à 11.

17voto

Asaf Katz Points 2007

@philipheinser solution fonctionne en effet.

Cependant, je m'attendrais à ce que l'outil React Native Barre d'état s'en chargera pour nous.

Malheureusement, ce n'est pas le cas, mais nous pouvons faire abstraction de cela assez facilement en créant notre propre composant autour de lui :

./StatusBar.js

import React from 'react';
import { View, StatusBar, Platform } from 'react-native';

// here, we add the spacing for iOS
// and pass the rest of the props to React Native's StatusBar

export default function (props) {
    const height = (Platform.OS === 'ios') ? 20 : 0;
    const { backgroundColor } = props;

    return (
        <View style={{ height, backgroundColor }}>
            <StatusBar { ...props } />
        </View>
    );
}

./index.js

import React from 'react';
import { View } from 'react-native';

import StatusBar from './StatusBar';

export default function App () {
    return (
      <View>
        <StatusBar backgroundColor="#2EBD6B" barStyle="light-content" />
        { /* rest of our app */ }
      </View>
    )
}

Avant :

Après :

0voto

philipheinser Points 237

Vous pouvez gérer cela en ajoutant un padding à votre composant de barre de navigation ou simplement ajouter une vue qui a la même hauteur que la barre d'état en haut de votre arbre de vue avec une couleur de fond comme l'application facebook le fait.

6 votes

Cette valeur de hauteur est-elle fixe et ne change pas quel que soit le téléphone que vous avez ? Si oui, où puis-je trouver des informations sur la valeur spécifique correcte pour iOS / Android ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X