【问题标题】:How to render react native app under the status bar?如何在状态栏下渲染 React Native App?
【发布时间】:2019-09-03 05:18:54
【问题描述】:

我正在学习 react native 中的应用程序开发,我的应用程序与手机的状态栏重叠。如果我在顶部添加填充,那么不同手机的填充会有所不同。我尝试使用 SafeAreaView,但它不起作用,我在某处读到它只适用于 iPhone。那么有什么方法可以在状态栏下呈现应用程序?任何建议将不胜感激。

应用与状态栏重叠

【问题讨论】:

标签: reactjs react-native


【解决方案1】:

您需要找到状态栏高度并将容器的上边距设置为等于该数量。

由于 Expo 将此值作为常量提供,您可以使用它来设置父组件的样式,以便内容始终位于状态栏下方。

您可以从 github 问题 here 中遵循此模式

const App = StackNavigator({
  Home: { screen: HomeScreen },
  About: { screen: AboutScreen },
  }, {
    navigationOptions: { headerStyle: { marginTop: Expo.Constants.statusBarHeight } }
  })

【讨论】:

  • 感谢您的回复。我正在使用 react-native-router Flux 进行导航,并尝试在我的路由器标签上的 sceneStyle 道具中添加此样式。但它给了我一个错误'TypeError: undefined is not an object(Evaluating Expo.Constants.statusBarHeight)'
  • 需要安装导入expo常量docs.expo.io/versions/latest/sdk/constants
【解决方案2】:

我终于通过简单地将paddingTop:StatusBar.currentHeight 添加到我的组件的根视图标签来解决它。

【讨论】:

    【解决方案3】:

    针对这个问题,我为我的屏幕创建了一个可重用的组件包装器,同时使用了SafeAreaViewView。示例代码。

    import React, { Component } from 'react';
    import { View, SafeAreaView, Platform, StatusBar } from 'react-native';
    
    const styles = {
      container: { StatusBar.currentHeight }
    };
    
    /**
     * Screen Wrapper to apply padding space on status bar
     */
    export const Screen = React.memo((props) => {
      if (Platform.OS === 'ios') {
        return (
          <SafeAreaView style={props.style}>
            {props.children}
          </SafeAreaView>
        );
      }
    
      return (
        <View style={[styles.container, props.style]}>
          {props.children}
        </View>
      );
    });
    

    然后我只需在屏幕需要填充空间的地方使用它。简单而有效。

    render() {
      <Screen>
        <Text>{'your screen content here'}</Text>
      </Screen>
    };
    

    【讨论】:

    • 您好,谢谢您的回复。我尝试了这种方法,但这只是给了我一个“不变违规”。元素类型无效:应为字符串或类,但未定义'。我正在使用 react-native-router-flux 进行导航。
    【解决方案4】:

    你应该像这样使用StatusBar

    import { View, StatusBar } from 'react-native';
    
    export const myComponent = () => {
        return (
             <View>
                   <StatusBar backgroundColor={colors.SECONDARY_COLOR} />
                   ... // your code
             </View>
        )
    }
    

    它将设置状态栏背景颜色,并防止与您的状态栏重叠。 如果您不想设置背景颜色,您可以使用:

    <StatusBar />
    

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 1970-01-01
      • 2021-06-25
      • 2019-12-09
      • 1970-01-01
      • 2023-03-22
      • 2020-07-19
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多