iconfont平台为icon的制作与使用提供了很好的平台。

但在设计中,往往使用symbol图标更有优势:

  1. 全局修改方便;
  2. 可以减少图层;
  3. 方便使用:可以把每个图标导出后,做成有导出标记的symbol图标,任意使用;
  4. 标注软件导出设计稿,开发可以直观的获取图标的名称,不用每次都手动导出图标。

所以,通过将iconfont 的项目图标库转化为sketch symbol库使用,对设计者有很大的好处。

建议:建立独立的项目icon 图标库,便于更新与维护。

一、iconfont平台图标库的建立

图标库从设计到应用

二、将iconfont 的项目图标库转化为sketch symbol库 插件

1、设计

image.png
1.1、icon项目名称
非必填

1.2、粘贴iconfont.js
1)、建立icon项目
2)、icon项目->下载至本地
3)、解压download.zip,打开iconfont.js,全部复制iconfont.js
4)、粘贴到框中

1.3、是否导出图标
默认导出图标,名称为图标的名称;
做成有导出标记的symbol图标,任意使用;标注软件导出设计稿,开发可以直观的获取图标的名称,不用每次都手动导出图标。

1.4、生成symbol大小为16*16像素,便于使用

1.5、增量式新增图标,不会影响以前的图标使用
删除需要手动删除。

2、设计实现(主要点)

2.1、解析iconfont.js
iconfont.js里有图标库的svg资源,第一步是解析svg:

  1. var myString = this.state.symbolString;
  2. var startIndex=myString.indexOf('<svg>');
  3. var endIndex=myString.indexOf('</svg>');
  4. var symbolString = myString.substring(startIndex+5,endIndex);
  5. var symbols = symbolString.split("<symbol");
  6. var symbolIcons = symbols.slice(1);
  7. this.state.symbolIcons = symbolIcons;

2.2、将icon插入画板,并转化为symbol
解析完svg资源,需要将symbolIcons传递给sketch做进一步处理:

1)、格式化图标svg:

  1. for(var i=0;i<symbolIcons.length;i++){
  2. var symbolstring = symbolIcons[i];
  3. var flagIndex = symbolstring.indexOf('<path');
  4. var need1 = symbolstring.substring(1,flagIndex);
  5. var need2 = symbolstring.substring(flagIndex);
  6. var need1json = need1.split(" ");
  7. var name = need1json[0].split("=")[1];
  8. var pureName = name.split('"')[1];
  9. console.log(pureName)
  10. var item = '<symbol> id="'+name+'" viewBox='+'"0 0 1024 1024">'+need2;
  11. if(!checkIcon(pureName)){
  12. doIconSymbol(item,pureName,i);
  13. }
  14. }

2)、生成icon symbol:

var newArtboard = new Artboard({
  name: name,
  frame:{
    x:i*(1024+iconDist),
    y:0,
    width:1024,
    height:1024
  }
})

var group = sketch.createLayerFromData(symbolstring, 'svg');
group.name = name.toString();
group.frame.x= (newArtboard.frame.width-group.frame.width)/2
group.frame.y= (newArtboard.frame.height-group.frame.height)/2
group.parent = newArtboard;

if(checkboxVisible){
  group.exportFormats = ['png'];
}

var master = SymbolMaster.fromArtboard(newArtboard)

master.parent = symbolsPage;

3)、过滤掉已经添加的icon symbol

var icons = symbolsPage.layers || [];
for(var i=0;i<icons.length;i++){
  if(icons[i].name === name){
    return true
  }
}
return false

image.png