iOS 自定義字體出問題啦!

本篇文章講的是在實際項目中碰到一款自定義字體在展現上出現問題,而後運用先進的蘋果爸爸的工具來解決這個問題的故事。html

1. 自定義字體出什麼問題了?

設計師們的做品老是變幻無窮,爲了成就他們,做爲程序員的咱們只好知足他們嘍。git

因此當設計師用到一款神奇的字體的時候,我是不會拒絕的,就像下面這個樣子:程序員

神奇的字體

爲了讓你們能更好的看到這個問題,我把 label 設置了一個背景色,label 的 width 和 height 都等於50。如今,在 storyboard 中看起來是沒問題的,讓咱們 Run 一下:github

實際運行的效果

對比 system font 字體的 label,明顯感受這個 DINCondensedC 字體的內容是偏上的!(固然不用對比也能發現)。WTF!bash

2. 解決思路

2.1 既然是內容偏上,那麼是否和 content Mode 有關?

惋惜的是,通過嘗試,改變 contentMode 並不能對 UILabel 產生任何影響(實際繪製內容中包含下方的空白)。app

結論:不可行ide

2.2 繼承 UILabel 並重寫 drawRect ?利用 CoreText 繪製字體?

這兩種方案應該是可行的,可是,爲了這個小字體,用得着這麼複雜的【計算字體大小】-【經過字體大小與 label 高度計算偏移量】-【用到這個字體的 label 統一換成 XXLabel 】流程嗎?工具

萬一哪天設計師說:來,我們來個富文本,中間這幾個字用 DINCondensedC 字體,兩邊的字用 system 字體,那你不是要哭了?字體

結論:不可行ui

2.3 程序解決不了,那就用人解決吧

讓咱們找到可愛的設計師,請他喝個下午茶,搓頓不錯的晚飯,帶他作個大保健,而後和他說:兄弟這個UI圖能夠換個字體嗎... 算了成本有點高。

結論:不可行

2.4 能否從字體入手,本身修改字體?

既然字體有點不太正常,那麼咱們只能使出大招:本身動手修改這個字體。聽說有一款 App:Glyphs 對於製做/修改字體來講,很強大!而後讓咱們好好下載,靜靜等待吧。下載完畢打開這個【PT DIN Condensed Cyrillic.ttf】字體文件,沒想到這個軟件還收費,只能試用幾天。試用就使用吧,可是,這個字體裏的每一個字符我都要一個一個去改?做爲程序員,不能忍!

結論:不可行

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】字體偏上的問題,所以,讓咱們來調節調節 ascender 這個屬性,將它從700改成900,而後保存文件。

3.4 將修改完的文件注入原 ttf 文件

打開終端,輸入:ftxdumperfuser -t hhea -A f PT\ DIN\ Condensed\ Cyrillic.ttf,注意這裏 -A 後面的 d 已經換成了 f ,回車。

3.5 替換原工程中的字體文件

切回咱們的工程,替換原字體文件,Run 一下:

修改後的字體

問題已解決!

4. Demo地址

點擊這裏直達倉庫

  • CustomFontIssues 爲字體有問題的工程
  • CustomFontIssuesResolve 爲已解決字體問題的工程

歡迎品嚐~

相關文章
相關標籤/搜索