IOS使用自定義字體的實現(xiàn)
前言
其實一直向寫點什么,但工作的忙碌,以及身體的惰性,導致一致沒有機會.最近終于擠出點時間,寫點東西吧,權當放松心情了吧.代碼實現(xiàn)采用Swift3.0
設置字體
系統(tǒng)默認提供的字體主要是指UIFont中提供的字體,其使用代碼為:
tipLabel.font = UIFont(name: "TypeLand YiFeng Scripture", size: 60)
當然這種設置方式是需要配置一些文件的:
-
把字體文件拖入到項目中,如圖所示,注意勾選:Copy Items if needed
字體拖入項目.png 配置
info.Plist文件,添加一項Fonts provided by application,在item 0項的value中填寫字體的PostScript名稱(而非字體文件的文件名,下面會講怎么獲取)

配置info.plist
- 查看是否添加成功.在項目中的viewDidload中加入測試代碼,如下:
override func viewDidLoad() {
super.viewDidLoad()
//獲取所有字體名稱及家族名
print(UIFont.familyNames)
}
輸出如下:

輸出結果.png
Tips:
- 這種方法只能通過
眼力去尋找你剛才添加的字體,其實還可以使用Mac自帶的字體冊應用查看.(后面介紹)
- 成功后來測試下字體吧.
private func demo() {
// 系統(tǒng)默認提供的字體主要是指UIFont中提供的字體,其使用代碼為:
view.addSubview(tipLabel)
tipLabel.font = UIFont(name: "TypeLand YiFeng Scripture", size: 60)
}
private lazy var tipLabel : UILabel = {
let lab = UILabel()
lab.textAlignment = .center
lab.textColor = UIColor.blue
lab.text = "IOS Custom字體Demo"
lab.bounds = self.view.bounds
lab.center = self.view.center
lab.numberOfLines = 0
return lab
}()
運行模擬器,結果如下:

模擬器
- 在xib/sb中也可以實現(xiàn)選擇.

xib
用字體冊獲取字體的PostScript名稱
- 打開
Launchpad-->其它-->字體冊,然后打開

字體冊
- 打開后,點擊工具欄中的
+,加入自定義字體.

點擊加號

添加字體
- 然后選中字體,右鍵,選中
驗證字體

驗證字體
- 在驗證字體界面展開字體,后就可以得到字體的
PostScript名稱了.

PostScript
動態(tài)獲取字體并設置的解決辦法
但是一般來說,字體文件比較大,不該內置,而且如果都用plist預定義的方式,那肯定就沒法覆蓋全,導致用戶不能使用更多自己喜歡的字體。所以應該用代碼讀取字體的方式:
- 提供字體文件路徑,返回所需要字體:
/// 根據字體路徑,大小返回字體對象
///
/// - Parameters:
/// - path: 字體路徑
/// - size: 字體大小
/// - Returns: UIFont對象
private func customFont(with path: String , size: CGFloat) -> UIFont {
let fontUrl = URL(fileURLWithPath: path)
let fontData = CGDataProvider(url: fontUrl as CFURL)
let fontRef = CGFont(fontData!)
CTFontManagerRegisterGraphicsFont(fontRef, nil)
let fontName = fontRef.postScriptName as! String
let font = UIFont(name: fontName, size: size)
return font!
}
- 使用時則直接調用
private func demo() {
// 系統(tǒng)默認提供的字體主要是指UIFont中提供的字體,其使用代碼為:
view.addSubview(tipLabel)
// tipLabel.font = UIFont(name: "TypeLand YiFeng Scripture", size: 60)
let path = Bundle.main.path(forResource: "TpldYiFengScripture.otf", ofType: nil)
//獲取字體
tipLabel.font = customFont(with: path!, size: 50)
}
則一樣能正常顯示.
Tip: 方法內部,多處強制解包,和類型轉換,應該guard守護下(若傳入路徑為錯誤的路徑,則會崩潰.應當注意),當然倉促之間,有錯誤的話,歡迎指出,一起討論.
