本篇文章講的是在實際項目中碰到一款自定義字體在展示上出現(xiàn)問題腊嗡,然后運用先進的蘋果爸爸的工具來解決這個問題的故事舷手。
1. 自定義字體出什么問題了拧簸?
設(shè)計師們的作品總是千變?nèi)f化,為了成就他們聚霜,作為程序員的我們只好滿足他們嘍狡恬。
所以當設(shè)計師用到一款神奇的字體的時候,我是不會拒絕的蝎宇,就像下面這個樣子:
為了讓大家能更好的看到這個問題,我把 label 設(shè)置了一個背景色祷安,label 的 width 和 height 都等于50±呀妫現(xiàn)在,在 storyboard 中看起來是沒問題的汇鞭,讓我們 Run 一下:
對比 system font 字體的 label凉唐,明顯感覺這個 DINCondensedC 字體的內(nèi)容是偏上的!(當然不用對比也能發(fā)現(xiàn))霍骄。WTF台囱!
2. 解決思路
2.1 既然是內(nèi)容偏上,那么是否和 content Mode 有關(guān)读整?
可惜的是簿训,經(jīng)過嘗試,改變 contentMode 并不能對 UILabel 產(chǎn)生任何影響(實際繪制內(nèi)容中包含下方的空白)米间。
結(jié)論:不可行
2.2 繼承 UILabel 并重寫 drawRect 强品?利用 CoreText 繪制字體?
這兩種方案應(yīng)該是可行的屈糊,但是的榛,為了這個小字體,用得著這么復(fù)雜的【計算字體大小】-【通過字體大小與 label 高度計算偏移量】-【用到這個字體的 label 統(tǒng)一換成 XXLabel 】流程嗎逻锐?
萬一哪天設(shè)計師說:來夫晌,咱們來個富文本雕薪,中間這幾個字用 DINCondensedC 字體,兩邊的字用 system 字體晓淀,那你不是要哭了所袁?
結(jié)論:不可行
2.3 程序解決不了,那就用人解決吧
讓我們找到可愛的設(shè)計師要糊,請他喝個下午茶纲熏,搓頓不錯的晚飯,帶他做個大保健锄俄,然后和他說:兄弟這個UI圖可以換個字體嗎... 算了成本有點高局劲。
結(jié)論:不可行
2.4 可否從字體入手,自己修改字體奶赠?
既然字體有點不太正常鱼填,那么我們只能使出大招:自己動手修改這個字體。據(jù)說有一款 App:Glyphs 對于制作/修改字體來說毅戈,很強大苹丸!然后讓我們好好下載,靜靜等待吧苇经。下載完畢打開這個【PT DIN Condensed Cyrillic.ttf】字體文件赘理,沒想到這個軟件還收費,只能試用幾天扇单。試用就使用吧商模,但是,這個字體里的每個字符我都要一個一個去改蜘澜?作為程序員施流,不能忍!
結(jié)論:不可行
3. 最終的解決方案
最后還是得靠蘋果爸爸鄙信,大家的好爸爸瞪醋。蘋果提供了一款字體修改工具:Apple Font Tool Suite。下面就讓我們用該工具來解決這個棘手的問題装诡。
3.1 下載該工具
進入這里银受,滾到最下方,可以看到【Apple Font Tool Suite】慎王,點擊下方的下載蚓土,下載一個適合自己 Xcode 版本,下載完成后無腦安裝赖淤。
3.2 獲取字體的信息文件
打開終端蜀漆,輸入:ftxdumperfuser -t hhea -A d PT\ DIN\ Condensed\ Cyrillic.ttf
,前面的【ftxdumperfuser -t hhea -A d 】為指令咱旱,后面的為你的字體文件路徑确丢。最后回車绷耍,你會看到同級文件夾下回多出一個【DINCondensedC.hhea.xml】文件:
3.3 修改字體文件中的信息
讓我們打開這個字體文件,你會看到:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE hheaTable [
<!ELEMENT hheaTable EMPTY>
<!ATTLIST hheaTable versionMajor CDATA #IMPLIED
versionMinor CDATA #IMPLIED
ascender CDATA #IMPLIED
descender CDATA #IMPLIED
lineGap CDATA #IMPLIED
advanceWidthMax CDATA #IMPLIED
minLeftSideBearing CDATA #IMPLIED
minRightSideBearing CDATA #IMPLIED
xMaxExtent CDATA #IMPLIED
caretSlopeRise CDATA #IMPLIED
caretSlopeRun CDATA #IMPLIED
caretOffset CDATA #IMPLIED
metricDataFormat CDATA #IMPLIED
numberOfHMetrics CDATA #IMPLIED
>
]>
<!--
Data generated Sun Aug 13 18:51:10 2017
Generated by ftxdumperfuser build 347,
FontToolbox.framework build 257
Font full name: 'PT DIN Condensed Cyrillic'
Font PostScript name: 'DINCondensedC'
-->
<hheaTable
versionMajor="1"
versionMinor="0"
ascender="700"
descender="-209"
lineGap="68"
advanceWidthMax="889"
minLeftSideBearing="-270"
minRightSideBearing="-22"
xMaxExtent="844"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="234"
/>
沒錯這是個 XML 文件鲜侥,它里面包含了字體的一些公共信息:
- ascender:從字體的 baseLine 到最高處的距離
- descender:從字體的 baseline 到最低點的距離
- lineGap:印刷線的間距
- ...
這里面的每一項信息褂始,都可以從蘋果的:hheaTable文檔 這篇文檔中找到。文檔中可以看到描函,一款字體也是一個大工程崎苗。
今天我們要解決的,是【DINCondensedC】字體偏上的問題舀寓,因此胆数,讓我們來調(diào)節(jié)調(diào)節(jié) ascender 這個屬性,將它從700改為900互墓,然后保存文件必尼。
3.4 將修改完的文件注入原 ttf 文件
打開終端,輸入:ftxdumperfuser -t hhea -A f PT\ DIN\ Condensed\ Cyrillic.ttf
篡撵,注意這里 -A 后面的 d 已經(jīng)換成了 f 判莉,回車。
3.5 替換原工程中的字體文件
切回我們的工程育谬,替換原字體文件券盅,Run 一下:
問題已解決!
4. Demo地址
- CustomFontIssues 為字體有問題的工程
- CustomFontIssuesResolve 為已解決字體問題的工程
歡迎品嘗~