iconfont 图标转为字体_App 中使用 Iconfont 的整套方案

3208cc641d05ede32a1857a0ae5479ba.png

作者:集美貌与才华于一身的 小芳

29cd45785c8ff9a95112dcf9af1fa3dc.png

什么是Iconfont

我们通常看到的图标都是以图片形式集成到项目中使用,而 Iconfont 是一套字体图标,和我们使用自定义字体的方式是一样的,并且它是一种矢量图标。

计算机中显示的图形一般分为两类---位图和矢量图,我们平常使用的JPEG、PNG等图片都是位图格式,是一种由像素来表示的图像,而矢量图是由点、直线、多边形等基于数学方程的几何图元表示的图像,对比位图,矢量图具有体积小,放大缩小都不会失真的优点,这个优点就可以给项目带来很大好处了,但缺点是无法用来表达色彩层次丰富的图像,因此一些色彩复杂的图形仍然需要位图去表达。正巧我们项目在进行模块化,碰到不同模块使用到相同的图片时,尤其是这种基础icon,复制多份到各自的模块中是不太优雅的,利用Iconfont就可以很好的解决。

优点

  • 缩放不会模糊,告别iOS中2x/3x以及未来nx的问题
  • 一套资源可在web、iOS、Android等多个平台使用
  • 一键换肤、方便更改图片颜色,图片复用
  • 一定程度上减小包体积
  • 有利于项目模块化

缺点

  • 图标制作/更新成本高
  • 只支持单色

如何制作Iconfont

首先,你得拥有一套完美的图标库,如下图,这里我们选用Sketch为容器去维护这些图标,毕竟对程序员来说是比较容易上手的工具,注意矢量图的制作还是需要设计师的哦,不然有的是坑让你踩的。不管使用AI还是其他什么矢量图绘制软件制作的图标我们最终都放入这个文件中,后续的更新也是往后面逐一增加。

4fc3d3a2876a0c1ab3981787ea9cc890.png

可以看出来,其实都是一些基础通用icon,这些icon复用率非常高,如果你们公司有多个App,复用这一个字体文件就可以快速使用图标而不需要各种拷贝图片资源了。我们最终需要的是一个包含所有图标的字体文件即ttf文件,使用过自定义字体的开发者应该都知道ttf(TrueType font),我们在电脑上是可以直接双击ttf文件安装字体使用的。如下图

12e3fe0a894b95640dd6a42926262a42.png

那么如何将这些矢量图标最终合并为一个字体文件呢?

将sketch中的图标导出

上面说了有矢量图和位图之分,那么位图就是平常我们导出的后缀为png、jpeg、gif这种格式的,矢量图一般有.ai,.pdf,.svg等等,这里我们导出为svg格式。Bohemian Coding(Sketch的制作团队)发布过一款名为 SketchTool 的命令行工具,用来自动导出 .sketch 文件当中的界面和切片。如果你愿意手动一张张导出也可以,我敬你是条汉子~

安装好 sketch 后,在命令行中执行如下命令安装 sketchtool (换成你自己的路径)

sh /Applications/Sketch.app/Contents/Resources/sketchtool/install.sh

我们通过下面的命令批量导出图标,其中 ${SRCROOT}/../ZanIconFont/Icon/icons.sketch 替换成你的 iconfont.sketch 的路径,${SRCROOT}/../ZanIconFont/Icon/svg 替换成你的导出目标路径

sketchtool export slices ${SRCROOT}/../ZanIconFont/Icon/icons.sketch --output=${SRCROOT}/../ZanIconFont/Icon/svg --formats=svg

export slices :导出切片,这个跟sketch中的设置相关,我们这里每一个图标设置成了slice,所以对应的命令使用的是 export slices,如果每个图标都有自己的artboard,那么就是 export artboards。
--format=svg :导出为svg格式。

sketchtool相关的命令以及参数我们都可以通过在命令行中输入sketchtool来查看,这里就不细说啦。导出的部分svg图片如下:

3cf1dd8e19c43b63ac1034be2549d84e.png

合成ttf字体文件

我们需要将上述所有svg图片合并为一个ttf,这里我们使用的是内部前端组开发的一个命令行工具 iconfount,已经开源,安装以及详细说明可以在github上看到。

在命令行中执行

iconfount --found-config.js

其中 found-config.js 是你的配置文件,支持js或者json,在iconfount项目的sample/目录下有个示例配置文件,可以参考。看下我们的配置文件部分截图:

59059c5b599ac35521012946aec3aa35.png

name:字体名称(familyName),就是后续代码中注册字体用到的。
output:输出字体、样式以及示例文件的目录,可以是相对路径或者绝对路径
glyphs_dir:存放svg文件的根目录,就是上一步生成的svg目录。
glyphs:所有图标的定义,每个图标都有keywords、src等等若干其他属性,我们这里只需要使用src属性即可。最好与项目中每个图标的name保持一致。

其他的参数在github上都有详细说明,这里就不一一列举啦。

最终会生成如下一些文件

478c1185c137c9148612b6ef52fb88c8.png

可以看到在font文件夹中已经包含了ttf,另外还有woff、eot等其他类型,这些都是用于web端的,对于App可以先不用管。我们再看到有个demo.html如下,列举了图标列表,点击右上角show codes可以查看对应的编码。我们在项目中使用iconfont时是需要依赖这个demo.html的可视化界面的,否则你不知道编码所对应的图标是长什么样子的。

e7f40d4883a23e192d67f573643844e5.png

以上是生成ttf字体文件的整个流程,而另外也有很多优秀的平台提供整套功能,例如 Iconfonticomoonfontello 等等,这些平台都提供了很多成熟的图标集,支持在线导入自定义的SVG图标,生成样式、字体文件等等一整套方案,关于这些平台的使用这里不再赘述,各个官网以及很多文章都有很详细的说明。但是我们考虑到的是后期维护更新还是比较麻烦,如果更新图标需要重新导入到平台上、生成字体文件、再引入项目,每次需要手动去完成。因此产生了 iconfount,他是基于fontello、使用了很多fontello的代码和库而开发一个命令行工具,能够很好的整合到项目中完成自动化,后续图标更新了,设计师只要更新图标本身即可,而我们的Iconfont库重新build一遍即可完成所有的操作。这里iOS使用了Cocoapods去管理Iconfont私有库,因此每次更新图标后Iconfont库的开发者去更新下sketch整个文件,重新build一遍就会自动去执行导出svg图标、生成字体文件的脚本,业务方升级一下版本即可。

在iOS中使用

先看下简单的demo

f4292c81411b0f81ff7ef2152eb51863.png

首先把上面制作的ttf字体文件引入到项目中,代码中注册字体,打印出来是可以找到你的字体的。

+ (void)registerFontWithURL:(NSURL *)url {NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);CGDataProviderRelease(fontDataProvider);CTFontManagerRegisterGraphicsFont(newFont, nil);CGFontRelease(newFont);NSLog(@"%@",[UIFont familyNames]);
}

使用场景:

as text

是字体文件的一般用法,代码如下。但是这种方式在替换原来的图标过程中会改变添加控件的方式,原本都是用UIImageView图片控件而现在要改成UILabel或其他文本控件了,所以这边我们推荐使用第二种。

label.attributedText = [ZanIconFont attributedStringWithIcon:zicon_edit fontSize:20 color:[UIColor redColor]]

部分实现

+ (NSAttributedString *)attributedStringWithIcon:(ZanIconName)iconName fontSize:(CGFloat)fontSize color:(UIColor *)color
{UIFont *font = [self fontWithSize:fontSize];NSMutableDictionary *attributed = [NSMutableDictionary dictionaryWithDictionary:@{NSFontAttributeName:font}];if (color) {[attributed setObject:color forKey:NSForegroundColorAttributeName];}return [[NSAttributedString alloc] initWithString:iconName attributes:attributed];
}

as image

我们采用Category的方式对UIImageView增加设置图片的方法,同时也可以对UIButton、UILabel等其他控件增加Category。这里会去读取UIImageView控件的bounds作为image的size。

[self.imageView setImageWithIcon:zicon_edit];

也可以自定义image的size、fontSize、tintColor等属性

UIImage *image = [ZanIconFont imageWithIcon:zicon_edit imageSize:CGSizeMake(30, 30) fontSize:20 tintColor:[UIColor redColor]];

部分实现

+ (UIImage *)imageWithIcon:(ZanIconName)iconName imageSize:(CGSize)imageSize fontSize:(CGFloat)fontSize tintColor:(UIColor *)tintColor
{if (!iconName) {NSAssert(iconName, @"icon object should not be nil, check if the font file is added to the application bundle and you're using the correct font name.");return nil;}UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);CGContextRef context = UIGraphicsGetCurrentContext();NSMutableAttributedString *fontString = [ZanIconFont attributedStringWithIcon:iconName fontSize:fontSize color:tintColor];CGSize iconSize = [fontString size] ;CGFloat xOffset = (imageSize.width - iconSize.width) / 2.0;CGFloat yOffset = (imageSize.height - iconSize.height) / 2.0;CGRect rect = CGRectMake(xOffset, yOffset, iconSize.width, iconSize.height);[fontString drawInRect:rect];UIImage *iconImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return iconImage;
}

也支持在Storyboard上设置icon name,通过Category对UIImageView增加IBInspectable类型的 iconName属性,匹配iconNameString对应的Unicode。

@implementation UIImageView (ZanIconFont)- (void)setIconName:(NSString *)iconNameString
{ZanIconName iconName = [ZanIconFont iconNameWithString:iconNameString];if (!iconName) {return;}[self setImage:[ZanIconFont imageWithIcon:iconName imageSize:self.bounds.size tintColor:self.tintColor]];
}@end

imageViewCategory

在Android中使用

可参考开源库 iconify

总结

起初Iconfont在web中使用比较流行,在App中使用较少,但是目前看来很多大厂的App也纷纷使用起来,Iconfont的接入给我们项目带来了很多的方便,同时也可以解决我们在模块化过程中不同模块之间重复图片的问题,总之利大于弊,小伙伴们赶紧用起来吧。

参考

使用IconFont减小iOS应用体积 dzenbot/Iconic

我们积极拥抱新技术,不给自己设边界,勇于跳出舒适区
iOS/Android 开发可投简历至 liangfei@youzan.com(微信:feelang )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

class之cls

cls代表的是类本身,一般在静态方法中使用 转载于:https://www.cnblogs.com/goldd/p/5563845.html

aix 的c库为什么都是静态库_Linux静态库生成指南

Linux上的静态库,其实是目标文件的归档文件。在Linux上创建静态库的步骤如下:写源文件,通过 gcc -c xxx.c 生成目标文件。用 ar 归档目标文件,生成静态库。配合静态库,写一个使用静态库中函数的头文件。使用静态库时&a…

什么从什么写短句_新年新气象跨年了,准备好发什么说说了吗

happy new year今天是2020年的最后一天我们即将跨过0点步入2021年喽欢喜,激动,感慨,顿时涌上心头在这有意义的时刻小新觉得极为有必要发跨年朋友圈概括小新这一年的功绩为这一年画上完美的句号嘿嘿但现在很是纠结到底该发点儿啥呢OMG!选择太多…

计算机显卡960,2015显卡开年之作!NVIDIA GTX960首测

【PConline 首发评测】回顾2014年显卡的发展,GTX980/970可谓是其中最浓墨重彩的一笔,超高的能效比的吸引力实在太大,但是作为旗舰级产品并不是每一个人都享用的起的。在经过长达4个月的等待之后,我们终于等来的Maxwell架构的中端主…

mllib逻辑回归 spark_《Spark大数据分析实战》笔记

写在前面:此书很棒,但需要一定的编程功底,此外强烈建议买书,因为很多架构图、算子列表,我也不会摘抄下来。第一章 简介1.Spark执行的特点Hadoop中包含计算框架MapReduce和分布式文件系统HDFS等。Spark是MapReduce的替代…

晶振波形不是正弦波_晶振的分类及其应用

晶振分类虽然多种多样(可以在电子元器件采购平台亿配芯城上查看分类),但是晶振的作用无非是以下2种:1.为系统提供基本的时钟信号。一个系统共用一个晶振,便于各部分保持同步(有些通讯系统的基频和射频虽然使用不同的晶振&#xff…

第三代航空轴承钢产品 css-42l,航空轴承钢的发展及热处理技术(一)

航空轴承钢的发展及热处理技术(一)随着航空航天技术的发展,轴承钢的种类和承溫能力逐渐提高。我国航空航天轴承的热处理技术一直处于发展阶段,但与国外轴承钢的热处理技术相比仍有一定的上升空间。总结国内外航空航天轴承钢及热处理技术的发展&#xff0…

画米老鼠_蔡康永都在买的画你也买得起,村上隆作品收藏大全

疫情爆发已经一个多月了,大家的情绪犹如坐过山车跌宕起伏,从彷徨焦虑迷茫到惊恐绝望,再到现在的翘首以望。在疫情爆发之际,钟南山院士说了一句话特别鼓舞我,他呼吁宅家隔离,待春暖花开之时,我们…

本地服务器的音乐如何才能播放视频文件夹,mx播放器如何添加本地文件 添加本地文件设置方法...

更换播放器皮肤/主题颜色在这个版本中 主题颜色的设置十分丰富 不再拘泥于原来的黑白二色点击“设置”选择“列表”项 修改主题,选择一种自己喜欢的颜色 现在有十五种颜色可以选择用mxplayer播放音乐虽然它的功能包含了播放本地音频 但是实际使用的过程中我们可以发…

hbase本地调试环境搭建

1,前言 想要深入的了解hbase,看hbase源码是必须的。以下描述了搭建hbase本地调试环境的经历 2,安装步骤 2.1,启动hbase 1,安装java和IDE IntelliJ,下载源码等。步骤这里不再描述。 2,从HMaster以…

微信墙服务器地址,一面微信墙的诞生(3) 用户端界面的创建

在用户发表留言之前,需要进入登录状态。在微信平台中,登录应该是一个自动的过程:用户只需要进行一次授权,往后的登录都由后台自己来处理。在 client 文件夹下新建 index.php :登录流程首先要处理自动登录这一流程&…

pg数据库json数据类型_PostgreSQL与开发者起舞—让数据库更好服务于开发

写在前面的话:本文内容有对应50分钟视频讲解,有兴趣可以访问PG与开发者共舞。很多数据库的对比的活动都是基于数据库本身的一些的底层的功能以及纯数据库方面的对比,等等。更多方面数据库是要为应用来服务的,而生产应用的大部分都…

系统启动 之 Linux系统启动概述(2)

博客:http://blog.csdn.net/younger_china/article/details/51615916 Linu系统启动是一个”冗长乏味”的过程,那么我们现就需要去经历一下这个冗长乏味的生活。我们按照如下流程来分析: 1. 史前时代:BIOS 计算机在上电那一刻几乎是毫无用处的…

python 全文搜索 句子_python新玩法:用python进行文章摘要拿取,只需要一行代码

前言今天为大家介绍一个python算法TextRank,实现从长篇中快速抽取精准摘要。TextRank是一种基于图形的文本处理排序算法。PageRank通常用作其底层的图排序模型。当然,其他的图排序模型也可以与之结合。TextRank算法不需要深入的语言和专业知识,因为它是一…

Django小项目简单BBS论坛

开发一个简单的BBS论坛项目需求:1 整体参考“抽屉新热榜” + “虎嗅网” 2 实现不同论坛版块 3 帖子列表展示 4 帖子评论数、点赞数展示 5 在线用户展示 6 允许登录用户发贴、评论、点赞 7 允许上传文件 8 帖子可被置顶 9 可进行多级评论知识必备&#x…

时间转年月日_编程中常见的时间格式

时间格式前端和后端时经常会遇到各种各样的时间格式,这些格式在编写程序的时候都需要去使用不同的处理方式,这里集中写一下。先说一下各种不同的时间格式。类型名格式说明ISO 8601一般:2020-12-05T05:33:19Z 东八区:2004-05-03T17…

外星人台式机无盘服务器,可以拎走的“台式机” Alienware Area-51m评测

Alienware外星人这个品牌曾经一度是游戏笔记本领域的执牛耳者,自从1996年创立以来,品牌宗旨就是提供最强的PC性能,最有个性的设计和最好的服务。凭借着强悍的配置、创新的黑科技和酷炫的灯效,其一度是业内高端和高品质的代名词。但…

法流程图_世界五大学习方法之西蒙学习法

世界五大学习方法之西蒙学习法摘要:西蒙学习法为6个月可以掌握任何一门学问,它的本质是广义动量定理。广义动量定理通过调整力量、方向、作用点和时间来增加成果。西蒙学习法使用了降低问题难度方法中的一种:拆分。本节分为四个部分&#xff…

生成word_Word如何生成目录?3个步骤轻松掌握!

在使用Word编写长篇文档时,我们经常会给内容生成一个目录,有了目录,无论是阅读还是查找内容,都非常方便。Word生成目录是一项核心功能,这是每个使用Word的人,必须要掌握的一项技巧。如果你还不会这项技巧&a…

启动go服务_内网穿透工具 FRP公网服务端、内网客户端快速配置文件说明

内网穿透工具 FRP 公网服务端、内网客户端 frps.ini 、frpc.ini 配置文件常用设置展示及说明公网服务端 frps.ini 配置文件常用设置公网服务端配置文件:frps.ini[common]bind_port 7000# vhost_http_port 参数来设置 HTTP 访问端口,此处示例&#xff1a…