最近在做一個神奇的 App 需要新增楷體,檢查了一下發現 iOS 預設並不會安裝這種字型,需要我們自己將字型檔案新增到 App 中,本文主要記錄了新增自定義字型的過程、新增完成後的效果以及遇到的一些坑,文中 iOS 程式碼主要為 Swift 3。
1. 檢視全部可用字型
在進行操作之前,我們先檢視預設情況下,系統的可用字型有哪些,利用如下程式碼可以將系統全部字型的 FontFamilyName 以及它們的 FontName 進行列印:
for fontFamily in UIFont.familyNames {
print(fontFamily)
for font in UIFont.fontNames(forFamilyName: fontFamily) {
print(fontFamily + ": " + font)
}
}
複製程式碼
我們可以在日誌輸出視窗搜尋我們需要的楷體,可以看到預設並沒有安裝,效果如圖所示:
2. 獲取字型檔案
首先,我們需要獲取字型檔案,一般檔案型別為 ttf 或 ttc 的就是字型檔案了,如圖所示:
可以在 字型口袋,搜字網 之類的網站找到很多可供下載的資源:
或者也可以在 OS X 的系統字型冊找到我們想要的字型,可以從應用程式列表中開啟字型冊:
選擇 所有字型
然後在搜尋欄內鍵入需要查詢的字型名即可列出匹配的專案:
右鍵點選想要的字型選擇 在 Finder 中顯示
即可找到對應的字型檔案。
3. 新增字型檔案到工程
將我們獲取的字型檔案直接拖到工程中的合適位置,如圖所示:
新增完成後選中對應的字型檔案可進行預覽:
我們還需要在 Info.plist
檔案中新增 Fonts provided by application 項,如圖所示:
也可通過直接新增程式碼的方式完成,例如這裡新增兩個字型檔案 STKaiti.ttf 和 Kaiti-SC.ttf 的程式碼如下:
<key>UIAppFonts</key>
<array>
<string>STKaiti.ttf</string>
<string>Kaiti-SC.ttf</string>
</array>
複製程式碼
這時,我們對工程進行編譯,再次檢視可用的全部字型,這時我們可以看到,我們需要的楷體已經新增了進來:
4. 字型的使用
1. StoryBoard
在 StoryBoard 中使用的話,只需要設定控制元件的 Font 屬性為,選擇 Custom,然後再從 Family 中選擇需要的字型即可。
2. 程式碼
我們直接通過如下程式碼直接生成一個楷體的字型物件,將其賦給 UIButton 或者 UILabel 等空間對應的屬性即可。
UIFont(name: "STKaiti", size: 20)
複製程式碼
這裡需要注意的是 UIFont 的 name 字串必須是上面我們列印出的字型名稱,和字型檔案的檔名或者其他資訊無關。如果這裡我們輸入了一個無效的字型名稱,可能會返回一個空的物件,所以我的使用方式如下:
import Foundation
extension UIFont {
static func boldKaiti(ofSize fontSize: CGFloat) -> UIFont {
return UIFont(name: "Kaiti SC Black", size: fontSize) ?? UIFont.systemFont(ofSize: fontSize)
}
static func kaiti(ofSize fontSize: CGFloat) -> UIFont {
return UIFont(name: "Kaiti SC", size: fontSize) ?? UIFont.systemFont(ofSize: fontSize)
}
}
複製程式碼
使用楷體前後效果對比,可以看到換個字型以後感覺整個 feel 就不一樣了,可見我們要好好聽設計師蜀黍們的話,該用啥字型用啥字型,不能偷懶,? (嘛,控制元件位置還沒調整,第二段可能有點放不下了):
新增字型前 | 新增字型後 |
---|---|
5. 一些坑
1. 字型檔案過大
如果你用的字型檔案是 TTC 格式的,可以考慮去下載單獨的 TTF 字型檔案,TTC 是幾個 TTF 合成的字型檔,裡面包含不止一種字型型別。
然後多個類似的字型,可以和設計師商量一下統一使用同一種字型。
唔,如果是單個 TTF 檔案過大的話,暫時木有找到好的解決辦法,可以考慮多下幾個不同來源的同種字型的檔案,挑一個體積最小的。或者對現有的 TTF 檔案進行編輯,將一些低頻字元進行刪除。
2. 字型重名問題
在匯入同一種字型的不同風格時,比如這裡楷體的粗體 Kaiti-SC-Black
和普通體 Kaiti-SC-Regular
,在 App 中列印出的 FontName 居然只有一個楷體的,這是為啥呢,推測可能是字型檔案生成的時候填寫字型名偷工減料,沒有填寫完整的字型名或者字型名識別異常導致的。
然後我找了一個 OS X 下可用的免費字型編輯工具 BirdFont 對字型檔案進行檢視想一探究竟,官網地址 birdfont.org/,我用的是 2.15.5 版本,大家可以自行去官網下載最新版。
在 Finder 中開啟我們的字型檔案,右鍵選擇用 BirdFont 進行開啟即可,因為字型檔案資料量較大,開啟過程可能會有些長,需要耐心等待幾分鐘,具體時長根據資料量而定,等軟體右上角的 Loading 消失即表示開啟完成。
點選右上角選單,選擇 Name and Description 選項可開啟字型描述資訊編輯頁面:
在這裡我們可以看到,Kaiti-SC-Black 和 Kaiti-SC-Regular 兩個字型檔案的 Name
一欄確實是只寫了 Kaiti SC,和我們之前在 App 中輸出的字型名稱一致,Style
一欄雖然有所區別,但是我們在 App 中是無法通過 Style
這個引數來找到某個字型的(反正我沒找到,如果真的有辦法希望可以教我,蟹蟹,? ),所以這應該就是我們只能在 App 中找到一個楷體的原因了。
BirdFont Kaiti-SC-Black | BirdFont Kaiti-SC-Regular | App |
---|---|---|
然後我們對其中一個字型的 Name
做一下修改,反正使倆字型檔案的 Name 不一樣就行,然後我這裡將 Kaiti-SC-Black 的 Name
改為 Kaiti SC Black,改完之後需要先 Save,然後選擇 Import and Export:
然後再選擇 Export Fonts:
然後會彈出 Export Settings 頁面進行一些引數設定,注意將 Formats 中的 TTF 選項勾選即可,其他的兩個選項可以去掉,加快匯出速度。
然後單擊下面的 Export 按鈕即可開始匯出工作,右上角會出現一個 Loading 檢視,等它消失就表示匯出完成了,匯出完成後會在 Finder 中開啟對應字型檔案。
我們將其新增到工程中再看下能不能找到它:
可以看到這一次多了一個名為 Kaiti SC Black 的字型,完成!
PS:
最後吐槽一下,BirdFont 這工具真的好慢,巨慢,慢到爆炸,? 。大家在操作過過程中儘量挑體積小一點的字型檔案進行操作。不過還好,使用過程中還沒遇到閃退之類的狀況,功能上沒問題。希望後續版本能夠提高處理速度。
如有任何智慧財產權、版權問題或理論錯誤,還請指正。
https://juejin.im/post/5a3214f36fb9a0451238f744
轉載請註明原作者及以上資訊。