123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- import { getSystemInfoSync, getMenuButtonBoundingClientRectSync } from './useNativeAPI'
- export function getSafeAreaInset(safeAreaStyle = 'default') {
- // StatusBar & NavBar
- const isDefault = ['default', 'navBar'].includes(safeAreaStyle)
- // iPhoneX 竖屏安全区域
- const safeAreaInset = {
- top: isDefault ? 88 : 44, // StatusBar & NavBar
- left: 0,
- right: 0,
- bottom: 34, // Home Indicator
- }
- try {
- const menuRect = getMenuButtonBoundingClientRectSync()
- const windowInfo = getSystemInfoSync(['window', 'device'])
- const { safeArea, screenHeight, windowHeight } = windowInfo
- const isIOS = !!(windowInfo.system.toLowerCase().search('ios') + 1)
- // 状态栏高度
- const statusBarHeight = !windowInfo.statusBarHeight
- ? screenHeight - windowHeight - 20
- : windowInfo.statusBarHeight
- // 胶囊高度
- const navBarHeight = (menuRect.top - statusBarHeight) * 2 + menuRect.height
- // 下方扩展 4 像素高度, 防止下方边距太小
- const navBarExtendHeight = windowInfo.statusBarHeight && isIOS ? 4 : 0
-
- safeAreaInset.top = isDefault
- ? statusBarHeight + navBarHeight + navBarExtendHeight
- : Math.max(statusBarHeight, safeAreaInset.top)
- safeAreaInset.bottom = screenHeight - safeArea.bottom
- } catch (e) {
- /** Ignore */
- }
- return safeAreaInset
- }
- export const checkIPhoneX = ({ model, windowHeight, windowWidth }) => {
- return /iphone (x|12|13|14)/.test(model.toLowerCase()) || (windowHeight >= 812 && windowHeight / windowWidth > 2)
- }
|