IOS使用自定義字體的實現(xiàn)
前言
其實一直向?qū)扅c什么,但工作的忙碌,以及身體的惰性,導(dǎo)致一致沒有機會.最近終于擠出點時間,寫點東西吧,權(quán)當(dāng)放松心情了吧.代碼實現(xiàn)采用Swift3.0
設(shè)置字體
系統(tǒng)默認(rèn)提供的字體主要是指UIFont中提供的字體翩剪,其使用代碼為:
tipLabel.font = UIFont(name: "TypeLand YiFeng Scripture", size: 60)
當(dāng)然這種設(shè)置方式是需要配置一些文件的:
-
把字體文件拖入到項目中,如圖所示,注意勾選:Copy Items if needed
配置
info.Plist
文件,添加一項Fonts provided by application
,在item 0
項的value中填寫字體的PostScript名稱
(而非字體文件的文件名,下面會講怎么獲取)
- 查看是否添加成功.在項目中的viewDidload中加入測試代碼,如下:
override func viewDidLoad() {
super.viewDidLoad()
//獲取所有字體名稱及家族名
print(UIFont.familyNames)
}
輸出如下:
Tips:
- 這種方法只能通過
眼力
去尋找你剛才添加的字體,其實還可以使用Mac自帶的字體冊
應(yīng)用查看.(后面介紹)
- 成功后來測試下字體吧.
private func demo() {
// 系統(tǒng)默認(rèn)提供的字體主要是指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
}()
運行模擬器,結(jié)果如下:
- 在xib/sb中也可以實現(xiàn)選擇.
用字體冊
獲取字體的PostScript名稱
- 打開
Launchpad
-->其它
-->字體冊
,然后打開
- 打開后,點擊工具欄中的
+
,加入自定義字體.
- 然后選中字體,右鍵,選中
驗證字體
- 在驗證字體界面展開字體,后就可以得到字體的
PostScript
名稱了.
動態(tài)獲取字體并設(shè)置的解決辦法
但是一般來說穴张,字體文件比較大巩剖,不該內(nèi)置,而且如果都用plist預(yù)定義的方式敦迄,那肯定就沒法覆蓋全宪摧,導(dǎo)致用戶不能使用更多自己喜歡的字體。所以應(yīng)該用代碼讀取字體的方式:
- 提供字體文件路徑颅崩,返回所需要字體:
/// 根據(jù)字體路徑,大小返回字體對象
///
/// - 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!
}
- 使用時則直接調(diào)用
private func demo() {
// 系統(tǒng)默認(rèn)提供的字體主要是指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: 方法內(nèi)部,多處強制解包,和類型轉(zhuǎn)換,應(yīng)該guard守護下(若傳入路徑為錯誤的路徑,則會崩潰.應(yīng)當(dāng)注意),當(dāng)然倉促之間,有錯誤的話,歡迎指出,一起討論.