IOS使用自定义字体的实现
前言
其实一直向写点什么,但工作的忙碌,以及身体的惰性,导致一致没有机会.最近终于挤出点时间,写点东西吧,权当放松心情了吧.代码实现采用Swift3.0
设置字体
系统默认提供的字体主要是指UIFont中提供的字体,其使用代码为:
tipLabel.font = UIFont(name: "TypeLand YiFeng Scripture", size: 60)
当然这种设置方式是需要配置一些文件的:
-
把字体文件拖入到项目中,如图所示,注意勾选: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自带的字体册
应用查看.(后面介绍)
- 成功后来测试下字体吧.
private func demo() {
// 系统默认提供的字体主要是指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中也可以实现选择.
用字体册
获取字体的PostScript名称
- 打开
Launchpad
-->其它
-->字体册
,然后打开
- 打开后,点击工具栏中的
+
,加入自定义字体.
- 然后选中字体,右键,选中
验证字体
- 在验证字体界面展开字体,后就可以得到字体的
PostScript
名称了.
动态获取字体并设置的解决办法
但是一般来说,字体文件比较大,不该内置,而且如果都用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() {
// 系统默认提供的字体主要是指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守护下(若传入路径为错误的路径,则会崩溃.应当注意),当然仓促之间,有错误的话,欢迎指出,一起讨论.