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

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

Github地址:github.com/gaoxiaosong…

目前支持如下功能:

  • 横屏和竖屏模式。
  • 安全区域支持。
  • 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~~

转载于:https://juejin.im/post/5bfe0793e51d4538e36241b6

React Native中自定义导航条的更多相关文章

  1. React Native自定义导航条

    Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...

  2. 在 React Native 中使用 Redux 架构

    前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也 ...

  3. React Native : 自定义视图

    代码地址如下:http://www.demodashi.com/demo/11686.html 这次我们要做的仿 新闻头条 的首页的顶部标签列表,不要在意新闻内容. 请求数据 首先做顶部的目录视图,首 ...

  4. [转] 在React Native中使用ART

    http://bbs.reactnative.cn/topic/306/%E5%9C%A8react-native%E4%B8%AD%E4%BD%BF%E7%94%A8art 前半个月捣腾了一下Rea ...

  5. iOS11自定义导航条上移处理

    image.png 在自定义导航条时,通常会继承系统的UINavigationBar,但如上图,在iOS11上,导航条改动了.自定义导航条代码 -(MBNavigationBar *)myNavBar ...

  6. react native 中的ListView

    ListView 的运用: 1.首先在react native中引入这个组件: 2.初始化的ListView 的相关属性: constructor(props) { super(props); con ...

  7. React Native 中的component 的生命周期

    React Native中的component跟Android中的activity,fragment等一样,存在生命周期,下面先给出component的生命周期图 getDefaultProps ob ...

  8. React Native 中 component 生命周期

    React Native 中 component 生命周期 转自 csdn 子墨博客  http://blog.csdn.net/ElinaVampire/article/details/518136 ...

  9. React Native 中 CSS 的使用

    首先声明,此文原作者为黎 跃春 React Native中CSS 内联样式 对象样式 使用Stylesheet.Create 样式拼接 导出样式对象 下面的代码是index.ios.js中的代码: / ...

随机推荐

  1. Spring (六):整合Mybatis

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  2. MyBatis(六):SqlSession执行源码分析

    SqlSession执行源码分析 针对以下代码 public class MybatisUtils { private static SqlSessionFactory sqlSessionFacto ...

  3. Genetic CNN: 经典NAS算法,遗传算法的标准套用 | ICCV 2017

    论文将标准的遗传算法应用到神经网络结构搜索中,首先对网络进行编码表示,然后进行遗传操作,整体方法十分简洁,搜索空间设计的十分简单,基本相当于只搜索节点间的连接方式,但是效果还是挺不错的,十分值得学习 ...

  4. Flask 入门(五)

    jinjia2模板传参 在html中调用python代码中传入的参数规则己经在上文中说明白了,下面,我们来实用一下: 1.编辑index.py中的代码如下: from flask import Fla ...

  5. 队列的含义以及C语言实现顺序队列

    队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构. 什么是队列 与栈结构不同的是,队列的两端都"开口",要求数据只能从 ...

  6. 小程序后台隐藏后 socket 无法重新连接

    小程序后台隐藏后 socket 无法重新连接 连接时 fail 回调函数的事件参数:connectSocket:fail:jsapi has no permission,event=createSoc ...

  7. echarts多个数据添加多个纵坐标

    在我们echarts开发中,肯定会遇到一个问题.那就是当有多个数据且数据大小差距太大时,就会出现有些数据小到看不到的情况.所以在遇到这种情况时,我通常的解决办法就是给他多加一个坐标轴. option  ...

  8. Gatling脚本编写技巧篇(一)

    一.公共类抽取 熟悉Gatling的同学都知道Gatling脚本的同学都知道,Gatling的脚本包含三大部分: http head配置 Scenario 执行细节 setUp 组装 那么针对三部分我 ...

  9. Suctf知识记录&&PHP代码审计,无字母数字webshell&&open_basedir绕过&&waf+idna+pythonssrf+nginx

    Checkin .user.ini构成php后门利用,设置auto_prepend_file=01.jpg,自动在文件前包含了01.jpg,利用.user.ini和图片马实现文件包含+图片马的利用. ...

  10. NGINX 类漏洞 整理记录

    简单介绍NGINX: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行. 其特点是占有内存少,并发能力强,nginx的并 ...