这是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. Java HashMap源码详解

    Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 H ...

  2. 【高并发】什么是ForkJoin?看这一篇就够了!

    写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...

  3. Java数组的声明与创建

    今天在刷Java题的时候,写惯了C++发现忘记了Java数组的操作,遂把以前写的文章发出来温习一下. 首先,数组有几种创建方式? Java程序中的数组必须先进行初始化才可以使用,所谓初始化,就是为数组 ...

  4. Web Scraper 高级用法——使用 CouchDB 存储数据 | 简易数据分析 18

    这是简易数据分析系列的第 18 篇文章. 利用 web scraper 抓取数据的时候,大家一定会遇到一个问题:数据是乱序的.在之前的教程里,我建议大家利用 Excel 等工具对数据二次加工排序,但还 ...

  5. matplotlib TransformWrapper

    2020-04-09 23:26:53 --Edit by yangray TransformWrapper 是Transform的子类, 支持在运行中替掉一个变换(可以是不同类型, 但维度必须相同) ...

  6. Python设计模式(5)-代理模式

    # coding=utf-8 # 代理模式:# * 代理类成为实际想调用对象的中间件,可以控制对实际调用对象的访问权限# * 可以维护实际对象的引用 class DbManager: def __in ...

  7. hadoop(八)集群namenode启动ssh免密登录(完全分布式五)|10

    前置章节:hadoop集群配置同步(hadoop完全分布式四)|10 启动namenode之前: 1. 先查看有无节点启动,执行jps查看,有的话停掉 [shaozhiqi@hadoop102 ~]$ ...

  8. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(四)之Operators

    At the lowest level, data in Java is manipulated using operators Using Java Operators An operator ta ...

  9. Nexus3 集成 crowd 插件

    公司使用的软件开发和协作工具为 Atlassian 系列软件,所以统一使用 crowd 来实现统一登录(SSO). crowd 配置 具体操作细节见我之前写的 Atlassian 系列软件安装(Cro ...

  10. stand up meeting 12-8

    根据计划今天项目组成员和travis老师毕然同学进行了最后一次关于design和feature的确认meeting. 项目design和UI的改动较大,feature改动较小,需对UI进行重新整合,对 ...