React Native中自定義導(dǎo)航條

這是2017年年初開始的公司的項目脆霎,對于導(dǎo)航條的要求很高轩娶,Android和iOS上必須用一致的UI囚衔,按鈕位置還有各種顏色都有要求题篷,而且要適應(yīng)各種奇葩要求。

嘗試了一下當(dāng)時React Native自帶的導(dǎo)航斧散,完全不符合要求供常,于是自己手寫了一個導(dǎo)航。

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

目前支持如下功能:

  • 橫屏和豎屏模式鸡捐。
  • 安全區(qū)域支持栈暇。
  • Android和iPhone X的支持。
  • absolute布局支持箍镜。
  • 回退按鈕自動執(zhí)行源祈。
  • 標(biāo)題是否居中。
  • 導(dǎo)航條下方分隔線色迂。
  • 自定義按鈕文本或組件香缺。
  • 回退按鈕支持圖片+文本。
  • 全局和臨時自定義樣式歇僧。

設(shè)計思路

純粹使用Javascript寫的图张,沒有原生部分代碼。導(dǎo)航條分為兩大部分:空白區(qū)域和內(nèi)容區(qū)域诈悍。

另外整體還需要考慮布局祸轮,即position是relative還是absolute的情況,relative即正常的流式布局侥钳,absolute是絕對布局适袜,背景色一般是透明的,下方視圖滾動到一定距離后舷夺,背景色和按鈕苦酱、標(biāo)題顏色可能會由透明變成不透明。

空白區(qū)域

上方和左右空出的位置给猾,用于適應(yīng)上方的狀態(tài)欄疫萤,以及橫屏?xí)r候iPhone X左右的安全區(qū)域。

狀態(tài)欄的高度敢伸,要考慮在普通iPhone上的20pt扯饶,以及在iPhone X系列設(shè)備上的44pt,還有安卓設(shè)備的Translucent屬性详拙,以及橫屏狀態(tài)下iPhone會隱藏狀態(tài)欄帝际,安卓會保留狀態(tài)欄。

內(nèi)容區(qū)域

還有導(dǎo)航條本身的內(nèi)容饶辙,高度是44pt蹲诀,包括左側(cè)按鈕區(qū)域、標(biāo)題區(qū)域弃揽、右側(cè)按鈕區(qū)域脯爪。

左右兩側(cè)的按鈕區(qū)域则北,有可能由一個或多個按鈕組成,這里有只有圖標(biāo)的按鈕痕慢,只有文本的按鈕尚揣,回退按鈕,以及帶文本的回退按鈕等類型掖举。

而標(biāo)題區(qū)域快骗,也有只有文本的標(biāo)題,以及自定義視圖的標(biāo)題塔次,比如點擊后彈出下拉選擇框的標(biāo)題方篮。

使用方法

首先,安裝這個庫励负,可以用yarn或者npm安裝(二者選其一即可):

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

在程序中使用時藕溅,直接導(dǎo)入:

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

然后直接在一個頁面中,加入進去組件即可:

render() {
  return (
    <View style={{flex: 1}}>
      <NaviBar title={'測試頁面'} ... />
      ...
    </View>
  );
}

可以傳遞的屬性如下:

屬性名 描述
title 標(biāo)題文本或者一個視圖組件
titleCenter 標(biāo)題是否居中继榆,默認(rèn)是true
hasSeperatorLine 內(nèi)容區(qū)域底部是否有分隔線巾表,默認(rèn)是true
leftElement 左側(cè)按鈕區(qū)域,可以是文本或者數(shù)組略吨,默認(rèn)是只有一個回退按鈕標(biāo)識
rightElement 配置同上集币,默認(rèn)為空
onLeft 左側(cè)按鈕點擊回調(diào),會傳遞一個index晋南,如果是回退按鈕惠猿,則返回值是false即停止執(zhí)行自動goBack操作
onRight 右側(cè)按鈕點擊回調(diào)羔砾,同上參數(shù)
autoCloseKeyboard 回退時是否自動關(guān)閉鍵盤负间,默認(rèn)是true
autoHardwareBack 是否自動添加Android的回退按鍵操作,默認(rèn)執(zhí)行和回退按鈕相同的操作
disableLock 是否禁用按鈕點擊鎖姜凄,默認(rèn)不禁用政溃,即相同按鈕點擊執(zhí)行過程中再點擊無效
gobackImage 回退按鈕的默認(rèn)圖片
gobackText 回退按鈕中的文字,默認(rèn)沒有
isAbsolute 是否開啟postion為absolute的布局
isTranslucent Android設(shè)備是否設(shè)置Translucent屬性态秧,參見React Native的StatusBar中的相應(yīng)屬性
safeOptions 安全區(qū)域選項董虱,默認(rèn)開啟上、左申鱼、右三個部分愤诱,其中左和右主要針對iPhone X設(shè)備的橫屏模式
style 自定義樣式

修改自定義樣式

我們可以全局的修改,也可以臨時的修改捐友,樣式的區(qū)域鍵請參照src/style.js中的鍵名淫半。

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

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

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

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

臨時修改則直接傳遞屬性到style中即可匣砖,也是同樣的按照鍵名來覆蓋科吭。

其他工具

可以通過如下方式導(dǎo)入工具:

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

其中xxx對應(yīng)如下:

名稱 用途
InnerNaviBar NaviBar的內(nèi)部實現(xiàn)昏滴,主要用來修改defaultProps,而export default導(dǎo)出的NaviBar是加上了withNavigation高階組件的对人,用于自動連接導(dǎo)航器
NAVBAR_HEIGHT 導(dǎo)航條高度谣殊,始終是44
GOBACK_BUTTON 回退按鈕的標(biāo)識,用于在leftElementrightElement中傳遞牺弄,表示這一項是回退按鈕
GOBACK_IMAGE 回退按鈕的默認(rèn)圖片
forceInset 用于SafeAreaViewforceInset屬性姻几,直接用forceInset={forceInset(0,1,0,1)}替代復(fù)雜的參數(shù)結(jié)構(gòu)
getSafeAreaInset 獲取安全區(qū)域,有兩個參數(shù)势告,第一個isLandscape參數(shù)鲜棠,如果不傳,則表示動態(tài)判斷培慌;第二個isTranslucent參數(shù)僅用于Android豁陆。返回上下左右四個方向的安全間距

樣例工程

example目錄中有樣例代碼,只有JS部分吵护。運行方法如下:

  • 進入example目錄盒音,運行yarn或者npm install
  • 繼續(xù)運行npm start馅而。
  • 換一個其他位置祥诽,運行react-native init test新建一個測試工程,然后運行這個工程瓮恭,連接到之前npm start啟動的http服務(wù)器上即可雄坪。

目前支持RN 0.57.3。

最后

這個導(dǎo)航條前后耗費了很久屯蹦,才算調(diào)試的比較穩(wěn)定而且能滿足各種要求了维哈。

歡迎各位在Issue留言,還有希望能給個Star哦~

我個人在Github上還有很多react-native相關(guān)的代碼庫登澜,歡迎Star以及Follow~~

其他文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脑蠕,一起剝皮案震驚了整個濱河市购撼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谴仙,老刑警劉巖迂求,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晃跺,居然都是意外死亡揩局,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門哼审,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谐腰,“玉大人孕豹,你說我怎么就攤上這事∈” “怎么了励背?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砸西。 經(jīng)常有香客問我叶眉,道長,這世上最難降的妖魔是什么芹枷? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任衅疙,我火速辦了婚禮,結(jié)果婚禮上鸳慈,老公的妹妹穿的比我還像新娘饱溢。我一直安慰自己,他們只是感情好走芋,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布绩郎。 她就那樣靜靜地躺著,像睡著了一般翁逞。 火紅的嫁衣襯著肌膚如雪肋杖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天挖函,我揣著相機與錄音状植,去河邊找鬼。 笑死怨喘,一個胖子當(dāng)著我的面吹牛津畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哲思,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼洼畅,長吁一口氣:“原來是場噩夢啊……” “哼吩案!你這毒婦竟也來了棚赔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤徘郭,失蹤者是張志新(化名)和其女友劉穎靠益,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體残揉,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡胧后,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抱环。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壳快。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡纸巷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眶痰,到底是詐尸還是另有隱情瘤旨,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布竖伯,位于F島的核電站存哲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏七婴。R本人自食惡果不足惜祟偷,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望打厘。 院中可真熱鬧修肠,春花似錦、人聲如沸户盯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽先舷。三九已至艰管,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒋川,已是汗流浹背牲芋。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捺球,地道東北人缸浦。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像氮兵,于是被迫代替她去往敵國和親裂逐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345