React Native如何使用IconFont庫及自定義font庫

前言

iconFont的使用對于前端開發同學肯定不陌生,移動端開發也有普遍的使用。
既然這多公司都選擇使用iconFont,那它比使用image資源有什么優勢尼?

  • 體積小
    • iconFont字體庫的體積小,能大大的減少安裝包的體積
  • 便捷
    • 能隨意更換字體的大小和顏色而且還不會失真,這一點是圖片資源所做不到的
  • 省事
    • 現在網上開源的字體庫越來越來,給設計也帶來便利,設計不需要在自己去切圖做圖了,只需要在網上搜索需要的字體直接拿過來使用即可。
      既然好處這么多,那我們在平時開發中也肯定要使用iconFont。今天我們就來簡單的講解在react-native開發中如何使用iconFont以及如何自定義自己的字體庫。

預覽效果圖

想運行demo查看效果請點擊

iOS

iOS

Android

Android

如何 install、link

react-native開發中,我們使用最多的字體庫是三方的開源字體庫組件:react-native-vector-icons,查看react-native-vector-icons官方地址請點擊
由于iconFont依賴原生工程,這里接入iconFont也就區分iOS和Android平臺。

Installing

  • npm install react-native-vector-icons --save

Linking Native Dependencies

自動link(推薦使用此方式添加原生依賴)
  • react-native link react-native-vector-icons
手動link(不推薦,對于不懂原生開發的同學稍微有些復雜)
iOS
  • 手動link有兩種方式:
    • 手動添加配置項
    • pod安裝
Android
  • 手動link有兩種方式:
    • 依次編輯settings.gradle、build.gradle、MainApplication.java
    • Gradle安裝

注意

介于一部分同學對于iOS\android原生工程的一些配置使用不是很熟悉,這里我們就采取最簡單的自動link方式:react-native link react-native-vector-icons。如果有同學想學習如何手動添加原生依賴,可以參考官方安裝教程

如何使用

當我們 install 和link 完成后,在iOS環境下,我們就可以正常的使用react-native-vector-icons組件提供的字體了。

  • import Icon from 'react-native-vector-icons/FontAwesome'

  • <Icon name="rocket" size={30} color="#900" />

但是對于安卓環境下,我們運行程序,Android工程可能報如下錯誤:

error

studio報錯:react-native-vector-icons中 Failed to find Bulid Tools revision 26.0.1

這時我們來對比下我們工程中app\build.gradle中的BulidToolsVision和node_modules中的react-native-vector-icons組件中android目錄下的build.gradle文件中的BulidToolsVision。我們發現兩個BulidToolsVision版本號不一致。

項目工程中的BulidToolsVision
組件庫中的BulidToolsVision

這時我們只需要將node_modules中的react-native-vector-icons組件中BulidToolsVision改成和項目工程中一致,在重新build即可。

build成功后的輸出日志

success

最后我們在重新運行Android項目即可。

上面所講的都是react-native-vector-icons原生字體的使用,下面我們就來講如何自定義字體庫。

  • 下載字體庫,這里就以下載阿里巴巴矢量圖標庫中的字體來講。沒有賬號的同學自己注冊賬號。我們將選擇好的字體下載至本地。注意:下載的文件夾中有一個.ttf的文件,后面有用。
iconfont
ttf

iOS

  • 在Xcode項目工程目錄下創建一個fonts文件夾
icon
  • 將之前下載到本地的.ttf字體文件拖到我們創建好的fonts文件夾中,這時Xcode會彈出提示,我們按下面的勾選即可。
icon
  • 在工程的plist文件中我們點擊+添加字體庫,注意:字體庫的名字要和下載下來的字體文件名字一致。
plist

到此iOS環境下添加自定義字體庫環境配置完畢

Android

  • 在項目app/src/main/assets/fonts文件夾中,將我們下載到本地的.ttf字體文件拖到此目錄中。
adnroid

到此Android環境下添加自定義字體庫環境配置完畢

封裝自定義字體庫組件,這里我就不一一講解如何封裝字體庫組件了,下面直接貼出封裝好的組件源碼,同學們想運行demo查看效果請點擊

  • 封裝的組件源碼如下:
/**
 * Created by guangqiang on 2017/9/14.
 */
import FontAwesome from 'react-native-vector-icons/FontAwesome'
import {OIcon} from './oneIconFont'
import React, {Component} from 'react'
import PropTypes from 'prop-types'

const iconMap = {
  fontAwesome: FontAwesome,
  oneIcon: OIcon
}

class Icon extends Component {

  render() {
    const {name, size, color} = this.props
    if (!name.includes('|')) {
      throw new Error('name 解析錯誤!')
      return null
    }
    let nameArr = name.split('|')
    let fontlib = nameArr[0]
    let font = nameArr[1]
    let CustomIcon = iconMap[fontlib]
    if (!CustomIcon) throw new Error('沒有找到匹配的font庫,請review代碼!')
    return (
      <CustomIcon name={font} size={size} color={color}/>
    )
  }
}

Icon.propTypes = {
  name: PropTypes.string.isRequired,
  size: PropTypes.number.isRequired,
  color: PropTypes.string.isRequired
}

export {Icon}
  • 字體庫映射表如下:
/**
 * Created by guangqiang on 2017/9/14.
 */
import {createIconSet} from 'react-native-vector-icons'

const glyphMap = {
  tb_Picture_o: 59032,
  tb_article_o: 59576,
  tb_Movie_o: 58904,
  tb_Music_o: 58881,
  toastError_s: 58954,
  toastSuccess_s: 58894,
  toastWarning_s: 58882,
  bookMark_o: 59044,
  music_paused_o: 58880,
  music_playing_s: 58889,
  drop_menu_s: 59693,
  like_o: 58910,
  horn_playing_o: 58920,
  horn_paused_o: 58918,
  nav_back_o: 58914,
  share_o: 58888,
  more_v_o: 58963,
  comment_o: 58923,
  love_s: 58902,
  love_o: 58905,
  downLoad_o: 58906,
  menu_h_o: 58987,
  music_pre_o: 58883,
  music_next_o: 58890,
  scale_o: 58903,
  reply_o: 58884,
  back_s_o: 58885,
  music_single_cycle_o: 58891,
  music_cycle_o: 58924,
  music_random_o: 58886,
  new_tag_o: 58974,
  video_o: 58980,
  star_o: 58892,
  play_cycle_o: 58907,
  comment_dot_o: 58887,
  tv_o: 58913,
  shrink_o: 58896,
  unlocked_o: 58898,
  locked_o: 58921,
  download_o: 58901,
  share_dot_o: 58915,
  ex_mark_o: 58897
}

const OIcon = createIconSet(glyphMap, 'iconfont', 'iconfont.ttf')

export {OIcon}

如果運行程序報錯:

err

解決方案:

// react 15.5.0版本之后,廢除PropTypes屬性,需要單獨引入prop-types這個包。
import React, {Component, PropTypes} from 'react'

// 將引入PropTypes屬性從react替換到prop-types包
import PropTypes from 'prop-types'

注意點

tip
  • toastError_s: 這個是自定義的icon的名字
  • 58954: 這個是字體的十六進制轉為的十進制后的值
  • iconfont和iconfont.ttf這個要和導入程序中的字體庫文件名保持一致。

如何使用自定義字體庫

  • import {Icon} from './icon'
<Icon name={'oneIcon|toastError_s'} size={20} color={'#dad'}/>
<Icon name={'oneIcon|nav_back_o'} size={20} color={'black'}/>

總結

建議同學們下載作者的demo工程iconfontDemo和查看官方文檔相結合學習。iconFont使用牽扯的內容太多,對于非原生開發,沒有使用過iconFont的同學們可能感覺很繞,工程需要配置的東西太多,不知道如何配置。如果同學們在接入過程中還是遇到了問題,可以給我留言或者加群620792950溝通。喜歡的同學們請 點贊 關注 star

福利時間

  • 作者React Native開源項目OneM地址(按照企業開發標準搭建框架設計開發):https://github.com/guangqiang-liu/OneM (歡迎小伙伴們 star)
  • 作者簡書主頁:包含50多篇RN開發相關的技術文章http://www.lxweimin.com/u/023338566ca5 (歡迎小伙伴們:多多關注多多點贊)
  • 作者React Native QQ技術交流群:620792950 歡迎小伙伴進群交流學習
  • 友情提示:在開發中有遇到RN相關的技術問題,歡迎小伙伴加入交流群(620792950),在群里提問、互相交流學習。交流群也定期更新最新的RN學習資料給大家,謝謝支持!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容