如何在React Native中设置iOS状态栏背景颜色?


75

在我可以修改以设置iOS statusbar backgroundColor的react native iOS本机代码中是否有一个地方?RCTRootView.m吗?

反应原生状态栏组件只支持的backgroundColor为仅适用于Android。

iOS操作系统似乎允许设置状态栏的backgroundColor

我的目标是使状态栏颜色更深。 例


有没有一种方法可以获取带有此按钮的任务栏的源代码(菜单,搜索等)?谢谢
AlainIb '17

github.com/oblador/react-native-vector-icons包含在material.io/icons上找到的所有Google Material Design图标,以及您可以在此处浏览的许多其他图标:oblador.github.io/react-native-vector-icons
山的埃德

Answers:


196

iOS没有状态栏背景的概念。这是跨平台的方法:

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

const MyStatusBar = ({backgroundColor, ...props}) => (
  <View style={[styles.statusBar, { backgroundColor }]}>
    <StatusBar translucent backgroundColor={backgroundColor} {...props} />
  </View>
);

class DarkTheme extends Component {
  render() {
    return (
      <View style={styles.container}>
        <MyStatusBar backgroundColor="#5E8D48" barStyle="light-content" />
        <View style={styles.appBar} />
        <View style={styles.content} />
      </View>
    );
  }
}

const STATUSBAR_HEIGHT = Platform.OS === 'ios' ? 20 : StatusBar.currentHeight;
const APPBAR_HEIGHT = Platform.OS === 'ios' ? 44 : 56;

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  statusBar: {
    height: STATUSBAR_HEIGHT,
  },
  appBar: {
    backgroundColor:'#79B45D',
    height: APPBAR_HEIGHT,
  },
  content: {
    flex: 1,
    backgroundColor: '#33373B',
  },
});

AppRegistry.registerComponent('App', () => DarkTheme);

模拟器


12
哇!我刚刚在Android和iOS上进行了测试。完善!这是一个出色的跨平台解决方案,可以立即使用!非常感谢您抽出宝贵时间发布此信息。我希望这会对许多开发人员有所帮助。
山之Ed

我尝试使用该<Navigator.NavigationBar/>组件在导航栏的其余部分中进行类似的修复,但无法使其正常工作(尝试了顶部边框并在其中插入了另一个组件)。有任何想法吗?
布拉德·亚当斯

1
仅当您的内容不超过屏幕尺寸时,这才行吗?如果必须滚动,状态栏的背景将被隐藏。
某物

1
@sowmya更新了解决方案,以添加对较新版本的Android的支持。
jmurzy

@jmurzy不知道为什么我的状态栏上有渐变的bg颜色...知道如何删除它吗?我想要像您的例子一样,平坦……
ComeRun '17

55

添加import { StatusBar } from 'react-native';到您的顶部,app.js然后添加StatusBar.setBarStyle('light-content', true);为您的第一行,render()以将状态栏文本/图标更改为白色。

其他颜色选项是'default''dark-content'

请参阅https://facebook.github.io/react-native/docs/statusbar.html了解更多信息。

除此之外:不,您将必须点击提供的链接。


理想情况下,将把对StatusBar.setBarStyle()的调用放在哪里?我尝试将其放在我的根组件的render()和componentWillMount中,但它使Xcode严重崩溃...是否还有另一个地方可以很好地放置此调用?谢谢!
埃文·斯通·史东

好的-我想我可能已经解决了。我没有提到其他两个问题:1)我正在使用带有StatusBar的NavigatorIOS(我见过的大多数示例都使用通用的Navigator),以及2)我正在具有Release配置的设备上进行测试。因此...为了解决该问题,我从根组件中删除了该调用,并将其移至NavigatorIOS的initialRoute使用的组件(我们将其称为ToDoList)。在ToDoList的componentDidMount内部,我将调用添加到StatusBar.setBarStyle('light-content',false),它可以正常工作!
埃文·斯通·史东

4

如果您使用react-native-navigation,则需要:

1-)将此添加到您的info.plist文件中:

<key>UIViewControllerBasedStatusBarAppearance</key>
<string>YES</string>

2-)在render()函数的第一行,例如:

  render(){
    this.props.navigator.setStyle({
      statusBarTextColorScheme: 'light'
    });
    return (
      <Login navigator={this.props.navigator}></Login>
    );
  }

此示例会将状态栏转换为浅色的文本/按钮/图标颜色。 在此处输入图片说明


1
您发布的代码仅将状态栏的文本主题设置为浅色。您是如何获得与内容相同的背景的?
Ash Ash,

@Ash我假设如果标题是背景红色,则状态栏将自动变为红色,因为标题将位于状态栏后面
cristian camilocedeñogallego

4

在react-native中设置iOS和Android状态栏backgroundColor

    import React, { Component } from 'react';
    import { Platform, StyleSheet, View, StatusBar } from 'react-native';
    import Constants from 'expo-constants';


    class Statusbar extends Component {

        render() {
            return (
                <View style={styles.StatusBar}>
                    <StatusBar translucent barStyle="light-content" />
                </View>
            );
        }
    }

    const styles = StyleSheet.create({
        StatusBar: {
            height: Constants.statusBarHeight,
            backgroundColor: 'rgba(22,7,92,1)'
        }
    });

    export default Statusbar;

2
 render() {
        let { email, password, isLoading } = this.state
        return (
            <View style={{ flex: 1, }}>
                <StatusBar
                    translucent
                    barStyle="light-content"
                    //  backgroundColor="rgba(0, 0, 0, 0.251)"
                    backgroundColor='magenta'
                 />
            </View>
            )
        }

在此处输入图片说明


从本地反应状态栏?
库尔希德·安萨里

3
这是一部Android手机。这个问题是针对的iOS
伊万卡·托多罗娃

0

添加到根视图。(如果有,则退出SafeAreaView)

{Platform.OS === 'ios' &&
 <View style={{
     width: "100%",
     height: 100, // For all devices, even X, XS Max
     position: 'absolute',
     top: 0,
     left: 0,
     backgroundColor: "red"}}
/>}
// App screen
...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.