import { Platform, Dimensions, StatusBar } from 'react-native'; import { PlatformOS } from '../utils'; import { requireNativeModule } from '@xrnjs/modules-core'; // 通过`react-native-safe-area-context`库的`RNCSafeAreaContext` module获取到对应的安全区域。 // 安全区能力是可选的:缺少原生模块时仍需允许基础组件库被加载。 let RNCSafeAreaModule: any; try { RNCSafeAreaModule = requireNativeModule('RNCSafeAreaContext'); } catch { RNCSafeAreaModule = undefined; } // App应用屏幕宽高 export const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get('window'); // AppWindowMetrics export const { insets: SafeAreaInsets, frame: ScreenFrame } = RNCSafeAreaModule?.getConstants?.()?.initialWindowMetrics || {}; /** * 判断ios设备屏幕是否为刘海屏 * @returns bool */ export function isNotchScreen() { return ( Platform.OS === 'ios' && !Platform.isPad && !Platform.isTV && SafeAreaInsets?.top > 20 ); } /** * 状态栏高度,非刘海屏:20,刘海屏:44,灵动岛:59 */ export const STATUS_BAR_HEIGHT = isNotchScreen() ? SafeAreaInsets?.top : 20; /** * 导航栏高度 * @deprecated 请使用 `NAVIGATION_CONTENT_HEIGHT` */ export const NAVIGATION_HEIGHT = 44; /** * 页面顶部Header内容区域高度:状态栏高度 + 导航栏高度 * @deprecated 请使用 `HEADER_CONTENT_HEIGHT` */ export const SAFE_AREA_TOP_HEIGHT = STATUS_BAR_HEIGHT + NAVIGATION_HEIGHT; /** * 底部工具栏高度 * @deprecated 请使用 `BOTTOM_TAB_BAR_HEIGHT` */ export const TOOL_BAR_BOTTOM_HEIGHT = 49; /** * 底部安全区域margin * @deprecated 请使用 `BOTTOM_SAFE_AREA_HEIGHT` */ export const SAFE_AREA_BOTTOM_MARGIN = isNotchScreen() ? 34 : 0; /** * 页面底部Bottom内容区域高度:底部工具栏高度 + 底部安全区域margin * @deprecated 请使用 `BOTTOM_CONTENT_HEIGHT` */ export const SAFE_AREA_BOTTOM_HEIGHT = TOOL_BAR_BOTTOM_HEIGHT + SAFE_AREA_BOTTOM_MARGIN; // ---- 上面是老的常量定义,下面是新的常量定义 ---- /** * 顶部安全距离高度 */ export const TOP_SAFE_AREA_HEIGHT = isNotchScreen() ? 44 : 20; /** * 底部安全距离高度 */ export const BOTTOM_SAFE_AREA_HEIGHT = isNotchScreen() ? 34 : 0; /** * 导航栏内容区域高度 */ export const NAVIGATION_CONTENT_HEIGHT = 44; /** * 页面顶部Header内容区域高度:状态栏高度 + 导航内容区域高度 */ export const HEADER_CONTENT_HEIGHT = STATUS_BAR_HEIGHT + NAVIGATION_CONTENT_HEIGHT; /** * 底部TabBar内容区域高度 */ export const BOTTOM_TAB_BAR_HEIGHT = 49; /** * 页面底部Bottom内容区域高度:底部安全区域高度 + 底部tabBar内容区域高度 */ export const BOTTOM_CONTENT_HEIGHT = BOTTOM_SAFE_AREA_HEIGHT + BOTTOM_TAB_BAR_HEIGHT; /** * 内容区域高度:当前屏幕高度 - 顶部安全区域高度 - 底部安全区域高度 */ export const CONTENT_AREA_HEIGHT = Platform.OS === 'ios' ? SCREEN_HEIGHT - TOP_SAFE_AREA_HEIGHT - BOTTOM_SAFE_AREA_HEIGHT : Platform.OS === 'android' ? SCREEN_HEIGHT - (StatusBar as any)?.currentHeight : SCREEN_HEIGHT; // 暂不考虑横屏情况 const getDefaultHeaderHeight = (): [number, number] => { const headerHeight = PlatformOS.select({ ios: 44, android: 56, harmony: 56, default: 64, }); const statusBarHeight = PlatformOS.select({ ios: STATUS_BAR_HEIGHT, android: StatusBar.currentHeight, harmony: StatusBar.currentHeight, default: 0, }); return [headerHeight, statusBarHeight]; }; const [NavHeight, StatusBarHeight] = getDefaultHeaderHeight(); const CommonContentHeight = SCREEN_HEIGHT - NavHeight - StatusBarHeight; // 内容区高度 export const CONTENT_HEIGHT = PlatformOS.select({ ios: CommonContentHeight, harmony: SCREEN_HEIGHT / SCREEN_WIDTH > 1.8 ? CommonContentHeight + StatusBarHeight : CommonContentHeight, android: SCREEN_HEIGHT / SCREEN_WIDTH > 1.8 ? CommonContentHeight + StatusBarHeight : CommonContentHeight, default: CommonContentHeight, });