iOS 在 App 中使用自定義字型

EyreFree發表於2017-12-27

最近在做一個神奇的 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 項,如圖所示:

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 中選擇需要的字型即可。

在 StoryBoard 中使用

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 就不一樣了,可見我們要好好聽設計師蜀黍們的話,該用啥字型用啥字型,不能偷懶,? (嘛,控制元件位置還沒調整,第二段可能有點放不下了):

新增字型前 新增字型後
iOS 在 App 中使用自定義字型
iOS 在 App 中使用自定義字型

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 選項可開啟字型描述資訊編輯頁面:

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
iOS 在 App 中使用自定義字型
iOS 在 App 中使用自定義字型
iOS 在 App 中使用自定義字型

然後我們對其中一個字型的 Name 做一下修改,反正使倆字型檔案的 Name 不一樣就行,然後我這裡將 Kaiti-SC-Black 的 Name 改為 Kaiti SC Black,改完之後需要先 Save,然後選擇 Import and Export:

Import and Export

然後再選擇 Export Fonts:

Export Fonts

然後會彈出 Export Settings 頁面進行一些引數設定,注意將 Formats 中的 TTF 選項勾選即可,其他的兩個選項可以去掉,加快匯出速度。

Export Settings

然後單擊下面的 Export 按鈕即可開始匯出工作,右上角會出現一個 Loading 檢視,等它消失就表示匯出完成了,匯出完成後會在 Finder 中開啟對應字型檔案。

匯出完成

我們將其新增到工程中再看下能不能找到它:

新增 Kaiti SC Black 字型

可以看到這一次多了一個名為 Kaiti SC Black 的字型,完成!

PS:

最後吐槽一下,BirdFont 這工具真的好慢,巨慢,慢到爆炸,? 。大家在操作過過程中儘量挑體積小一點的字型檔案進行操作。不過還好,使用過程中還沒遇到閃退之類的狀況,功能上沒問題。希望後續版本能夠提高處理速度。


如有任何智慧財產權、版權問題或理論錯誤,還請指正。
https://juejin.im/post/5a3214f36fb9a0451238f744
轉載請註明原作者及以上資訊。

相關文章