【发布时间】:2016-05-27 23:21:27
【问题描述】:
如何通过 React Native 找到 Android 上状态栏的高度?
如果我检查 React.Dimensions 高度,该值似乎也包括状态栏高度,但我试图找到没有状态栏的布局高度。
【问题讨论】:
标签: android react-native statusbar
如何通过 React Native 找到 Android 上状态栏的高度?
如果我检查 React.Dimensions 高度,该值似乎也包括状态栏高度,但我试图找到没有状态栏的布局高度。
【问题讨论】:
标签: android react-native statusbar
您不再需要任何插件,只需使用StatusBar.currentHeight:
import {StatusBar} from 'react-native';
console.log('statusBarHeight: ', StatusBar.currentHeight);
编辑:显然这似乎总是在 Android 上工作,但在 iOS 上,最初确实返回了 undefined :(
【讨论】:
不幸的是,从 v0.34 开始,执行此操作的 API 在平台之间仍然不一致。 StatusBarManager.HEIGHT 将为您提供 Android 上状态栏的当前高度。
import { Platform, NativeModules } from 'react-native';
const { StatusBarManager } = NativeModules;
const STATUSBAR_HEIGHT = Platform.OS === 'ios' ? 20 : StatusBarManager.HEIGHT;
在 iOS 上,您可以使用getHeight()
StatusBarManager.getHeight((statusBarHeight)=>{
console.log(statusBarHeight)
})
附带说明,如果您希望您的应用在 Android 上的状态栏下绘制类似于默认的 iOS 行为,您可以通过在 <StatusBar> 上设置几个 props 来实现,如下所示:
<StatusBar translucent={true} backgroundColor={'transparent'} {...props} />
【讨论】:
您可以使用这个帮助函数来获取 iOS 和 Android 上的状态栏高度。对于 iOS,当使用 >= iPhone X (with notch) 时,计算得到不同的 StatusBar 高度。
// functions-file.js
import { Dimensions, Platform, StatusBar } from 'react-native';
const X_WIDTH = 375;
const X_HEIGHT = 812;
const XSMAX_WIDTH = 414;
const XSMAX_HEIGHT = 896;
const { height, width } = Dimensions.get('window');
export const isIPhoneX = () => Platform.OS === 'ios' && !Platform.isPad && !Platform.isTVOS
? width === X_WIDTH && height === X_HEIGHT || width === XSMAX_WIDTH && height === XSMAX_HEIGHT
: false;
export const StatusBarHeight = Platform.select({
ios: isIPhoneX() ? 44 : 20,
android: StatusBar.currentHeight,
default: 0
})
然后导入的时候直接使用:
import { StatusBarHeight } from './functions-file.js'
height: StatusBarHeight
如果您使用 react-navigation-stack 另一个选项 - 它通过钩子提供标题高度 - https://reactnavigation.org/docs/en/stack-navigator.html#headertransparent
import { useHeaderHeight } from 'react-navigation-stack';
// ...
const headerHeight = useHeaderHeight();
【讨论】:
导入常量和维度。
import Constants from 'expo-constants';
import Dimensions from 'react-native';
在样式表中容器高度 - 状态栏高度 = 没有状态高度。
container: { height: Dimensions.get('window').height - Constants.statusBarHeight,}
【讨论】:
expo-constants 可以安装在一个裸露的(非 expo 管理的)项目中。所以@Oman 的答案在任何情况下都适用。
“React-native-status-bar-height”是一个帮助你获取状态栏高度的小库。
【讨论】:
import {NativeModules} from 'react-native';
// ...
const {StatusBarManager} = NativeModules;
const height = StatusBarManager.HEIGHT;
【讨论】: