如何在 React Native 中设置 iOS 状态栏背景颜色?
How to set iOS status bar background color in React Native?
我可以修改 react native iOS 本机代码中的一个位置来设置 iOS 状态栏背景色吗? RCTRootView.m ?
react native StatusBar component 仅支持 backgroundColor 仅适用于 Android。
iOS operating system seems to allow setting status bar backgroundColor
我的目标是使状态栏颜色更深。
将 import { StatusBar } from 'react-native';
添加到 app.js
的顶部,然后将 StatusBar.setBarStyle('light-content', true);
添加到 render()
的第一行以更改状态栏 text/icons变白。
其他颜色选项是 'default'
和 'dark-content'
。
请参阅 https://facebook.github.io/react-native/docs/statusbar.html 了解更多信息。
除此之外:不,您必须遵循您提供的 link。
iOS 没有状态栏背景的概念。以下是您如何以跨平台方式实现这一目标:
import React, {
Component,
} from 'react';
import {
AppRegistry,
StyleSheet,
View,
StatusBar,
Platform,
SafeAreaView
} from 'react-native';
const MyStatusBar = ({backgroundColor, ...props}) => (
<View style={[styles.statusBar, { backgroundColor }]}>
<SafeAreaView>
<StatusBar translucent backgroundColor={backgroundColor} {...props} />
</SafeAreaView>
</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 = 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);
如果您使用的是 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>
);
}
此示例会将您的状态栏转换为浅色 text/buttons/icons。
在 react-native 中设置 iOS & Android 状态栏背景颜色
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;
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>
)
}
添加到根视图。 (如果有,则在 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
...
import {SafeAreaConsumer} from 'react-native-safe-area-context';
<SafeAreaConsumer>
{(insets)=>(
<View style={{flex:1}}>
<View style={{height:insets.top ,backgroundColor :"black"}}/>
<StatusBar barStyle="light-content"/>
<View style={{flex:1}}>
<Text>My Text</Text>
</View>
</View>
)}
</SafeAreaConsumer>
您需要对其进行自定义。
StatusBar 不是 ios 中屏幕布局的一部分,否则如果您使用 reac-native
中的 SafeAreaView
改为使用 react-native-safe-area-context 并对其进行自定义。
看到这个snack。
我能够在 iOS 上更改状态栏的背景颜色,但更新了 SafeAreaView
组件的 backgroundColor
属性。
<SafeAreaView style={{backgroundColor: 'blue'}}>
// App Content
</SafeAreaView>
请确保使用 padding
而不是 margin
。这是我的代码,它在 iOS:
中运行良好
import { SafeAreaView } from 'react-native'
import { StatusBar } from 'expo-status-bar'
// ...
// ...
return <SafeAreaView style={{ paddingTop: height }}>
{/* your content here */}
<StatusBar style="light" />
</SafeAreaView>
略微更改了 jmurzy 的解决方案,该解决方案应该适用于 android 和 iOS,包括带缺口的 iOS:
import React from 'react'
import { SafeAreaView, StatusBar, View } from 'react-native'
import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'
const App = () => {
const isDarkMode = true
return (
<SafeAreaProvider>
<CustomStatusBar
barStyle={isDarkMode ? 'light-content' : 'dark-content'}
backgroundColor={'red'}
/>
<SafeAreaView style={{ flex: 1 }}>
</SafeAreaView>
</SafeAreaProvider>
)
}
export default App
const CustomStatusBar = ({backgroundColor, ...props}) => {
const { top } = useSafeAreaInsets()
return (
<View style={{ height: (StatusBar.currentHeight || top), backgroundColor }}>
<SafeAreaView style={{ backgroundColor }}>
<StatusBar translucent backgroundColor={backgroundColor} {...props} />
</SafeAreaView>
</View>
)
}
如果您使用的是 React Navigation,那真的很简单!
只需设置 headerStyle
,另请参阅 documentation here。
类似
<Stack.Navigator initialRouteName="Home">
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
title: 'my app',
headerStyle: {
backgroundColor: 'green',
},
}}
/>
</Stack.Navigator>
这适用于 react-native-safe-area-context
版本 3.3.2
import { StatusBar } from "react-native"
import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"
const App = () => {
const theme = ... get your theme
return (
<>
<StatusBar
backgroundColor={theme === "light" ? "#fff" : "#000"}
barStyle={theme === "light" ? "dark-content" : "light-content"}
/>
<SafeAreaProvider>
<SafeAreaView
style={{
flex: 1,
backgroundColor: theme === "light" ? "#fff" : "#000",
}}
>
// stuff goes here
</SafeAreaView>
</SafeAreaProvider>
</>
)
}
我可以修改 react native iOS 本机代码中的一个位置来设置 iOS 状态栏背景色吗? RCTRootView.m ?
react native StatusBar component 仅支持 backgroundColor 仅适用于 Android。
iOS operating system seems to allow setting status bar backgroundColor
我的目标是使状态栏颜色更深。
将 import { StatusBar } from 'react-native';
添加到 app.js
的顶部,然后将 StatusBar.setBarStyle('light-content', true);
添加到 render()
的第一行以更改状态栏 text/icons变白。
其他颜色选项是 'default'
和 'dark-content'
。
请参阅 https://facebook.github.io/react-native/docs/statusbar.html 了解更多信息。
除此之外:不,您必须遵循您提供的 link。
iOS 没有状态栏背景的概念。以下是您如何以跨平台方式实现这一目标:
import React, {
Component,
} from 'react';
import {
AppRegistry,
StyleSheet,
View,
StatusBar,
Platform,
SafeAreaView
} from 'react-native';
const MyStatusBar = ({backgroundColor, ...props}) => (
<View style={[styles.statusBar, { backgroundColor }]}>
<SafeAreaView>
<StatusBar translucent backgroundColor={backgroundColor} {...props} />
</SafeAreaView>
</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 = 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);
如果您使用的是 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>
);
}
此示例会将您的状态栏转换为浅色 text/buttons/icons。
在 react-native 中设置 iOS & Android 状态栏背景颜色
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;
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>
)
}
添加到根视图。 (如果有,则在 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
...
import {SafeAreaConsumer} from 'react-native-safe-area-context';
<SafeAreaConsumer>
{(insets)=>(
<View style={{flex:1}}>
<View style={{height:insets.top ,backgroundColor :"black"}}/>
<StatusBar barStyle="light-content"/>
<View style={{flex:1}}>
<Text>My Text</Text>
</View>
</View>
)}
</SafeAreaConsumer>
您需要对其进行自定义。
StatusBar 不是 ios 中屏幕布局的一部分,否则如果您使用 reac-native
改为使用 react-native-safe-area-context 并对其进行自定义。
看到这个snack。
我能够在 iOS 上更改状态栏的背景颜色,但更新了 SafeAreaView
组件的 backgroundColor
属性。
<SafeAreaView style={{backgroundColor: 'blue'}}>
// App Content
</SafeAreaView>
请确保使用 padding
而不是 margin
。这是我的代码,它在 iOS:
import { SafeAreaView } from 'react-native'
import { StatusBar } from 'expo-status-bar'
// ...
// ...
return <SafeAreaView style={{ paddingTop: height }}>
{/* your content here */}
<StatusBar style="light" />
</SafeAreaView>
略微更改了 jmurzy 的解决方案,该解决方案应该适用于 android 和 iOS,包括带缺口的 iOS:
import React from 'react'
import { SafeAreaView, StatusBar, View } from 'react-native'
import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'
const App = () => {
const isDarkMode = true
return (
<SafeAreaProvider>
<CustomStatusBar
barStyle={isDarkMode ? 'light-content' : 'dark-content'}
backgroundColor={'red'}
/>
<SafeAreaView style={{ flex: 1 }}>
</SafeAreaView>
</SafeAreaProvider>
)
}
export default App
const CustomStatusBar = ({backgroundColor, ...props}) => {
const { top } = useSafeAreaInsets()
return (
<View style={{ height: (StatusBar.currentHeight || top), backgroundColor }}>
<SafeAreaView style={{ backgroundColor }}>
<StatusBar translucent backgroundColor={backgroundColor} {...props} />
</SafeAreaView>
</View>
)
}
如果您使用的是 React Navigation,那真的很简单!
只需设置 headerStyle
,另请参阅 documentation here。
类似
<Stack.Navigator initialRouteName="Home">
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
title: 'my app',
headerStyle: {
backgroundColor: 'green',
},
}}
/>
</Stack.Navigator>
这适用于 react-native-safe-area-context
版本 3.3.2
import { StatusBar } from "react-native"
import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"
const App = () => {
const theme = ... get your theme
return (
<>
<StatusBar
backgroundColor={theme === "light" ? "#fff" : "#000"}
barStyle={theme === "light" ? "dark-content" : "light-content"}
/>
<SafeAreaProvider>
<SafeAreaView
style={{
flex: 1,
backgroundColor: theme === "light" ? "#fff" : "#000",
}}
>
// stuff goes here
</SafeAreaView>
</SafeAreaProvider>
</>
)
}