关于React-Native底部tab高度初探

写这篇文章的原因,就是产品经理希望在app下方的tab上悬浮一条提示,我们的app用的是RN的框架,于是我调研了一番如何去计算底部tab栏的高度。去RN的社区逛了一圈,发现目前没有官方的方法能够直接调用得到底部tab高度,甚至还看到有人因为这一点而不满RN的开发人员,在社区吐槽(Trash Talk)。Anyway,那我们就自己来。

一、Tab栏自身的高度

这个地方去看了源码,发现tab的高度其实只有两个预设值,就是针对 iphpne || ipad做了判断,直接上相关源码。

const tabBarStyle = [
    styles.tabBar,
    this._shouldUseHorizontalLabels() && !Platform.isPad
      ? styles.tabBarCompact
      : styles.tabBarRegular,
    style,
];

const DEFAULT_HEIGHT = 49;
const COMPACT_HEIGHT = 29;

// 样式表
  iconWithExplicitHeight: {
    height: Platform.isPad ? DEFAULT_HEIGHT : COMPACT_HEIGHT,
  },

源码地址:https://github.com/react-navigation/tabs/blob/d2aa789109ed0df61c0c0ac7b759ac386a720804/src/views/BottomTabBar.js

二、关于IphoneX系列的SafeArea

iphone的底部会自增一个安全区域,那么安全区域的高度是多少呢,继续看源码。

LandScape Mode // 横屏模式
paddingLeft: 44
paddingRight: 44
paddingBottom: 24
paddingTop: 0

Portrait Mode // 竖屏模式
paddingLeft: 0
paddingRight: 0
paddingBottom:34
paddingTop:44  // ... Including Status bar height

可以看到底部的安全区域只对横竖屏做了处理,但是亲测,对iphoneX系列不同deviceHeight的机型,安全区域不一样。对于iPhonex/iPhoneXS,paddingBottom: 34,但是对于iPhoneXR/XS MAX,paddingBottom: 24,即iphonexr/xs max竖屏模式下被判断成横屏了。

三、总结

所以,对于安卓,你只需要得到tab的高度,然后绝对定位,不需要做特殊处理。对于iphone,你需要区别 iphoneX系列。

const styles = StyleSheet.create({
        bottomView : {
        position : "absolute",
        bottom : isIphoneXOrXS() ? dp(tab高度 + 34) : ( isIphoneXROrXSMax() ? dp(tab高度 + 24) : dp(tab高度) ), 
    },
})

插句题外话,tab高度的获取,我是直接用模拟器的toggle inspetor得到的。

四、补充对iphoneX系列手机的css判断方法

// iPhone X、iPhone XS
var isIPhoneX = /iphone/gi.test(window.navigator.userAgent) && window.devicePixelRatio && window.devicePixelRatio === 3 && window.screen.width === 375 && window.screen.height === 812;
// iPhone XS Max
var isIPhoneXSMax = /iphone/gi.test(window.navigator.userAgent) && window.devicePixelRatio && window.devicePixelRatio === 3 && window.screen.width === 414 && window.screen.height === 896;
// iPhone XR
var isIPhoneXR = /iphone/gi.test(window.navigator.userAgent) && window.devicePixelRatio && window.devicePixelRatio === 2 && window.screen.width === 414 && window.screen.height === 896;

五、小彩蛋

来看看社区里是怎么说的吧。 brentvatne是该框架的维护者之一。

以及社区里有人写了组件去判断tabbar的高度,对于博主的项目没有什么帮助,但是可能会对大家有用,需要的话可以链接里自取。https://github.com/react-navigation/tabs/issues/97

到这里,完结。撒花~

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Native中可以使用第三方库`react-native-scrollable-tab-view`来实现滑动标题栏。以下是一个简单的示例代码: ```tsx import * as React from 'react'; import { StyleSheet, Text, View } from 'react-native'; import ScrollableTabView, { DefaultTabBar } from 'react-native-scrollable-tab-view'; type Props = {}; const FirstTabScreen = () => { return ( <View style={styles.container}> <Text>First Tab</Text> </View> ); }; const SecondTabScreen = () => { return ( <View style={styles.container}> <Text>Second Tab</Text> </View> ); }; const ScrollableTabNavigator = (props: Props) => { return ( <ScrollableTabView renderTabBar={() => <DefaultTabBar />} tabBarUnderlineStyle={styles.tabBarUnderline} tabBarBackgroundColor="#FFFFFF" tabBarActiveTextColor="#000000" tabBarInactiveTextColor="#999999" > <FirstTabScreen tabLabel="Tab 1" /> <SecondTabScreen tabLabel="Tab 2" /> </ScrollableTabView> ); }; export default ScrollableTabNavigator; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, tabBarUnderline: { backgroundColor: '#000000', height: 2, }, }); ``` 在这个示例中,我们首先导入了`react-native-scrollable-tab-view`库中的`ScrollableTabView`和`DefaultTabBar`组件。然后,我们创建了两个Tab项组件`FirstTabScreen`和`SecondTabScreen`,每个组件中都有一个`tabLabel`属性,用于设置Tab的标签。最后,我们使用`ScrollableTabView`组件来包含Tab项,并设置了一些Tab导航的样式属性,例如`tabBarUnderlineStyle`、`tabBarBackgroundColor`、`tabBarActiveTextColor`和`tabBarInactiveTextColor`。在`renderTabBar`属性中,我们使用了`DefaultTabBar`组件来渲染Tab导航栏。 注意:`react-native-scrollable-tab-view`库已经很久没有更新了,建议使用`react-native-tab-view`等其他替代库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值