React Native中自定义导航条

这是2017年年初开始的公司的项目,对于导航条的要求很高,Android和iOS上必须用一致的UI,按钮位置还有各种颜色都有要求,而且要适应各种奇葩要求。

尝试了一下当时React Native自带的导航,完全不符合要求,于是自己手写了一个导航。

Github地址:https://github.com/gaoxiaosong/react-native-pure-navigation-bar

目前支持如下功能:

  • 横屏和竖屏模式。
  • 安全区域支持。
  • Android和iPhone X的支持。
  • absolute布局支持。
  • 回退按钮自动执行。
  • 标题是否居中。
  • 导航条下方分隔线。
  • 自定义按钮文本或组件。
  • 回退按钮支持图片+文本。
  • 全局和临时自定义样式。

设计思路

纯粹使用Javascript写的,没有原生部分代码。导航条分为两大部分:空白区域和内容区域。

另外整体还需要考虑布局,即position是relative还是absolute的情况,relative即正常的流式布局,absolute是绝对布局,背景色一般是透明的,下方视图滚动到一定距离后,背景色和按钮、标题颜色可能会由透明变成不透明。

空白区域

上方和左右空出的位置,用于适应上方的状态栏,以及横屏时候iPhone X左右的安全区域。

状态栏的高度,要考虑在普通iPhone上的20pt,以及在iPhone X系列设备上的44pt,还有安卓设备的Translucent属性,以及横屏状态下iPhone会隐藏状态栏,安卓会保留状态栏。

内容区域

还有导航条本身的内容,高度是44pt,包括左侧按钮区域、标题区域、右侧按钮区域。

左右两侧的按钮区域,有可能由一个或多个按钮组成,这里有只有图标的按钮,只有文本的按钮,回退按钮,以及带文本的回退按钮等类型。

而标题区域,也有只有文本的标题,以及自定义视图的标题,比如点击后弹出下拉选择框的标题。

使用方法

首先,安装这个库,可以用yarn或者npm安装(二者选其一即可):

yarn add react-native-pure-navigation-bar
npm install --save react-native-pure-navigation-bar

在程序中使用时,直接导入:

import NaviBar from 'react-native-pure-navigation-bar';

然后直接在一个页面中,加入进去组件即可:

render() {
  return (
    <View style={{flex: 1}}>
      <NaviBar title={'测试页面'} ... />
      ...
    </View>
  );
}

可以传递的属性如下:

属性名 描述
title 标题文本或者一个视图组件
titleCenter 标题是否居中,默认是true
hasSeperatorLine 内容区域底部是否有分隔线,默认是true
leftElement 左侧按钮区域,可以是文本或者数组,默认是只有一个回退按钮标识
rightElement 配置同上,默认为空
onLeft 左侧按钮点击回调,会传递一个index,如果是回退按钮,则返回值是false即停止执行自动goBack操作
onRight 右侧按钮点击回调,同上参数
autoCloseKeyboard 回退时是否自动关闭键盘,默认是true
autoHardwareBack 是否自动添加Android的回退按键操作,默认执行和回退按钮相同的操作
disableLock 是否禁用按钮点击锁,默认不禁用,即相同按钮点击执行过程中再点击无效
gobackImage 回退按钮的默认图片
gobackText 回退按钮中的文字,默认没有
isAbsolute 是否开启postion为absolute的布局
isTranslucent Android设备是否设置Translucent属性,参见React Native的StatusBar中的相应属性
safeOptions 安全区域选项,默认开启上、左、右三个部分,其中左和右主要针对iPhone X设备的横屏模式
style 自定义样式

修改自定义样式

我们可以全局的修改,也可以临时的修改,样式的区域键请参照src/style.js中的键名。

全局修改的方法(修改其他全局配置同样是更改defaultProps):

import { InnerNaviBar } from 'react-native-pure-navigation-bar';

InnerNaviBar.defaultProps.style.xxx = {
  // custom style
};

其中xxx就是src/style.js中的键名。

临时修改则直接传递属性到style中即可,也是同样的按照键名来覆盖。

其他工具

可以通过如下方式导入工具:

import { xxx } from 'react-native-pure-navigation-bar';

其中xxx对应如下:

名称 用途
InnerNaviBar NaviBar的内部实现,主要用来修改defaultProps,而export default导出的NaviBar是加上了withNavigation高阶组件的,用于自动连接导航器
NAVBAR_HEIGHT 导航条高度,始终是44
GOBACK_BUTTON 回退按钮的标识,用于在leftElementrightElement中传递,表示这一项是回退按钮
GOBACK_IMAGE 回退按钮的默认图片
forceInset 用于SafeAreaViewforceInset属性,直接用forceInset={forceInset(0,1,0,1)}替代复杂的参数结构
getSafeAreaInset 获取安全区域,有两个参数,第一个isLandscape参数,如果不传,则表示动态判断;第二个isTranslucent参数仅用于Android。返回上下左右四个方向的安全间距

样例工程

example目录中有样例代码,只有JS部分。运行方法如下:

  • 进入example目录,运行yarn或者npm install
  • 继续运行npm start
  • 换一个其他位置,运行react-native init test新建一个测试工程,然后运行这个工程,连接到之前npm start启动的http服务器上即可。

目前支持RN 0.57.3。

最后

这个导航条前后耗费了很久,才算调试的比较稳定而且能满足各种要求了。

欢迎各位在Issue留言,还有希望能给个Star哦~

我个人在Github上还有很多react-native相关的代码库,欢迎Star以及Follow~~

其他文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350