ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 使用自定义图标 * * * * * 一般APP中都不会少了图标,react-native-vector-icons组件给我们提供了很多内置的字体库,但是这并不能满足我们的业务需求,我们有自己的设计会设计出适合本项目的图标,并且可能会随着需求经常变更。这样使用自定义的图标显得非常必要。 **内置字体库:** * Entypo by Daniel Bruce (411 icons) * EvilIcons by Alexander Madyankin & Roman Shamin (v1.8.0, 70 icons) * Feather by Cole Bemis & Contributors (v3.2.2, 240 icons) * FontAwesome by Dave Gandy (v4.7.0, 675 icons) * Foundation by ZURB, Inc. (v3.0, 283 icons) * Ionicons by Ben Sperry (v3.0.0, 859 icons) * MaterialIcons by Google, Inc. (v3.0.1, 932 icons) * MaterialCommunityIcons by MaterialDesignIcons.com (v2.0.46, 2046 icons) * Octicons by Github, Inc. (v6.0.1, 177 icons) * Zocial by Sam Collins (v1.0, 100 icons) * SimpleLineIcons by Sabbir & Contributors (v2.4.1, 189 icons) **1.首先会使用react-native-vector-icons内置的库** ~~~ //安装 npm install react-native-vector-icons --save ~~~ 从`node_modules/react-native-vector-icons`中Fonts目录中需要的字体的ttf文件拖到xcode项目的Fonts文件夹下(新建一个Fonts文件夹),一定要是拖拽。 ![](https://box.kancloud.cn/5e32912e7e6e655c0bccb7406a66a130_520x660.png) ![](https://box.kancloud.cn/e358a044a6f93717604711e55f1f2326_1094x630.png) ![](https://box.kancloud.cn/b932d8e5a95804de4ebc660b2d5b87dd_1236x560.png) 然后打开`Info.plist`文件,新建`Fonts provided by application`属性,并配置你所需要的字体的ttf文件名。 ![](https://box.kancloud.cn/9ec2cfd40476067ae1d2511460be32bd_1666x670.png) **使用** ~~~ import Icon from 'react-native-vector-icons/FontAwesome'; const myIcon = (<Icon name="rocket" size={30} color="#900" />) ~~~ **2.如何使用IconFont** 我们可以参考一下该组件中FontAwesome字体是如何设计的。 ~~~ //FontAwesome.js import createIconSet from './lib/create-icon-set'; import glyphMap from './glyphmaps/FontAwesome.json'; const iconSet = createIconSet(glyphMap, 'FontAwesome', 'FontAwesome.ttf'); export default iconSet;export const Button = iconSet.Button; export const TabBarItem = iconSet.TabBarItem; export const TabBarItemIOS = iconSet.TabBarItemIOS; export const ToolbarAndroid = iconSet.ToolbarAndroid; export const getImageSource = iconSet.getImageSource; ~~~ ~~~ // FontAwesome.json { "glass": 61440, "music": 61441, "search": 61442, "envelope-o": 61443, "heart": 61444, "star": 61445, ... } ~~~ 所以我们要基于这个组件,自己写IconFont.js,在项目下新建一个文件放置IconFont.js,使用的时候引用即可。 ~~~ //IconFont.js import createIconSet from 'react-native-vector-icons/lib/create-icon-set'; const glyphMap = { "zanting": 58886, "bofang": 58887, "info1": 58888, "settings": 59018, "myfill": 59276, "read": 59202, "pic": 59035, ... } const iconSet = createIconSet(glyphMap, 'IconFont', 'IconFont.ttf'); export default iconSet; export const Button = iconSet.Button; export const TabBarItem = iconSet.TabBarItem; export const TabBarItemIOS = iconSet.TabBarItemIOS; export const ToolbarAndroid = iconSet.ToolbarAndroid; export const getImageSource = iconSet.getImageSource; ~~~ ~~~ import IconFont from './IconFont' // 比如过在tab中使用IconFont const TrainingTab = TabNavigator({ Course: { screen: Course, navigationOptions: () => navigationOpts({ tabBarLabel: "首页", headerTitle: "喜马课堂", headerLeft:null, //去除返回按钮 tabBarIcon: (({tintColor, focused}) => { //tabBar图标 return ( <IconFont name="kecheng1" style={{color: tintColor, fontSize: 24}}/> ) }), }) }, Mine: { screen: Mine, navigationOptions: () => navigationOpts({ tabBarLabel: "我的", headerTitle: "喜马课堂", headerLeft:null, //去除返回按钮 }) } }, tabNavigationOpts) ~~~ 首先我们需要在IconFont网上吧图标的ttf文件下载下来,在项目根目录新建Fonts文件放置ttf文件(切记不要放到react-native-vector-icons组件的Fonts里面去),接下来的步骤和插件内置的字体方法一样,把IconFont.ttf拖拽到xcode项目下的Font文件夹下,再配置Info.plist文件。 ![](https://box.kancloud.cn/e6ffbf6ff78c0ab186799a46a2a3ab0c_1686x730.png) `!!注意`:其实最麻烦的一点就是glyphMap自定义字体集的生成,其中`key`是图标的名字,值可以是UTF-8字符,也可以是字符编码。但是`value`的值必须是`十进制`,字体库提供的是十六进制的话需要转换成十进制的。如果字体少的话可以手动的转换,字体多的话需要用后端语言直接把ttf文件转换成十进制文档。 ~~~ // python def main(fontFile): try: font = TTFont("demo.ttf") glyphMap = font["cmap"].getcmap(3, 1).cmap // 从字体文件解析出十进制 result = {value: key for key, value in glyphMap.items()} output = "IconFont.json" f = file(output, "w+") f.write(json.dumps(result)) f.close() print "done ..." except: import traceback traceback.print_exc() ~~~