swift项目定义字体的方法(便捷的方法)
2018-08-24 本文已影响164人
栋柠柒
首先我们为了书写方便,需要把常用的几种字体写成枚举类型的方式,比如这样
public enum XDFont: String {
#if os(iOS){
case pingFangSCUltralight = "PingFangSC-Ultralight"
case pingFangSCRegular = "PingFangSC-Regular"
case pingFangSCSemibold = "PingFangSC-Semibold"
case pingFangSCThin = "PingFangSC-Thin"
case pingFangSCLight = "PingFangSC-Light"
case pingFangSCMedium = "PingFangSC-Medium"
}
}
然后再写一个UIFont的类扩展
import UIKit
extension UIFont {
/// Create a UIFont object with a `Font` enum
public convenience init?(font: XDFont, size: CGFloat) {
let fontIdentifier: String = font.rawValue
self.init(name: fontIdentifier, size: size)
}
}
使用的时候就可以这样用
let font = UIFont.init(font: XDFont.pingFangSCRegular, size: 15)
有没有很方便,免去手打字体名的烦恼了
作为爱折腾的我,心里想着一定有更简单的方法,那就是利用swift强大的协议扩展,进一步简化代码,这也是很swift的编程方式
具体步骤如下:
1.先声明一个名为FontRepresentable的协议,这个协议是继承自RawRepresentable的,顾名思义是一个用于枚举类型的扩展协议
import UIKit
public protocol FontRepresentable: RawRepresentable {}
2.然后把它扩展到String类型的枚举,联想到上面的String类型的枚举,很容易就想到第三步
extension FontRepresentable where Self.RawValue == String {
public func of(size: CGFloat) -> UIFont? {
return UIFont(name: rawValue, size: size)
}
public func of(size: Double) -> UIFont? {
return UIFont(name: rawValue, size: CGFloat(size))
}
}
3.接下来,我们定义的结构体类型需要实现这个协议
public enum XDFont: String, FontRepresentable{
#if os(iOS){
case pingFangSCUltralight = "PingFangSC-Ultralight"
case pingFangSCRegular = "PingFangSC-Regular"
case pingFangSCSemibold = "PingFangSC-Semibold"
case pingFangSCThin = "PingFangSC-Thin"
case pingFangSCLight = "PingFangSC-Light"
case pingFangSCMedium = "PingFangSC-Medium"
}
}
所以我们就能这样用
let font = XDFont.pingFangSCRegular.of(size: 15)
是不是就不用谢初始化代码了,也有代码提示了