承續上篇的用icon font來製作圖示, 之前所提到的都是利用現成的icon font, 但似乎大部分的icon font都沒有像material icon有支援ligatures, 沒支援的話, 在xcode裡面就無法像上一篇一樣, 直接在UI designer顯示對應的圖示, 另外如果需要使用自己的圖示呢?其實是有方法用SVG圖檔來製作自己的icon font的, 這篇就來介紹兩種用SVG圖檔製作一個有ligatures支援的字型檔
grunt-webfont
第一個方法就是利用grunt-webfont, Grunt是一個前端常用的建構工具, 而grunt-webfont是一個用來產生字型的task
安裝相關工具
由於需要使用Grunt, node.js是必須的, 另外由於需要使用到fontforge, 所以python也是必須的, 雖然說grunt-webfont也可以純nodejs的module來產生字型, 但那並無法支援ligatures, 所以fontforge是一定需要的
用npm i grunt --global
來安裝grunt
製作字型
- 建立一個空的目錄
- 在這個目錄執行
npm init
來產生package.json
npm i grunt-webfont --save
來安裝grunt-webfont並且把這個dependency 加到package.json
- 建立一個svg子目錄(目錄名稱隨你高興, 這邊以svg當例子), 把所有圖示的svg檔案全部放到這目錄去
- 建立Gruntfile.js , 這檔案就像是Makefile, 或像是build.gradle這樣的角色, 內容就像下面
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
webfont: {
icons: {
src: 'svg/*.svg',
dest: 'build/fonts',
options: {
engine: 'fontforge',
htmlDemo: true,
fontHeight: 96,
normalize: false,
ascent: 84,
descent: 12,
font: 'octicon',
fontFamilyName: 'octicon',
types: 'ttf',
ligatures: true,
startCodepoint: 0xF101
}
}
},
clean: [
'build/fonts/*'
]
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-webfont');
grunt.registerTask('font', ['clean', 'webfont']);
grunt.registerTask('default', [ 'font']);
};
這邊最主要也最重要的task就是webfont這個, 這裡面src
是svg檔的目錄, dest
是字型輸出的目錄, engine的部分指名fontforge, ligatures設定必須要是true(產生的字型的ligature的名字其實就是沿用svg的檔名)
建立好這個檔後執行grunt
即可
icomoon
上面的方法還是有點麻煩, 蠻手動的, 還有一個更方便的工具就是icomoon, 這東西方便更多, 它是一個相當強大的工具
從畫面上看, 它其實很簡單操作, 選定你所需要的圖示後, 按右下角的Generate Font
即可, 除了你可以自己import自己的svg檔案外, 它也提供很多付費跟免費的圖示供選用:
按下Generate Font
後, 並不會馬上讓你下載字型回家, 它會先讓你檢視字型將會包含的圖示, 這邊有件事很重要, 左上角有個fi
圖示(參照下圖), 按下去後, 下面的圖示下面會多一個fi的欄位, 這就是讓你設定這些圖示的ligature的, 如果需要一個有支援ligature的字型, 就需要去設定這邊
所有都沒問題後按下右下角的Download
就沒問題了