問題
iOS 中給文字設(shè)置斜體時, 中文下是沒有效果的. 這是因為 斜體需要字體的支持, iOS 默認(rèn)中文字體沒有對應(yīng)的斜體.
所以通過正常途徑設(shè)置斜體就沒有效果.
正常設(shè)置斜體:
ps: 以下所有的 setItalic(:)
方法都是 UIFont 擴(kuò)展的 extension 方法
func setItalic() -> UIFont {
var symTraits = fontDescriptor.symbolicTraits
symTraits.insert([.traitItalic])
var fontDescriptorVar = fontDescriptor.withSymbolicTraits(symTraits)
return UIFont(descriptor: fontDescriptorVar ?? fontDescriptor, size: 0)
}
方案
不用默認(rèn)的字體, 使用一種具有斜體樣式的字體
例如:
Font Family: Arial
Font: ArialMT
Font: Arial-BoldMT
Font: Arial-BoldItalicMT //加粗斜體
Font: Arial-ItalicMT //斜體使用 CGAffineTransform 對字體進(jìn)行處理
我們需要的效果是以左下角的錨點(diǎn)進(jìn)行傾斜
func setItalic() -> UIFont {
var symTraits = fontDescriptor.symbolicTraits
var fontDescriptorVar = fontDescriptor.withSymbolicTraits(symTraits)
fontDescriptorVar = fontDescriptorVar?.addingAttributes([.matrix: CGAffineTransform.skew(c: -15*CGFloat.pi/180, b: 0)])
return UIFont(descriptor: fontDescriptorVar ?? fontDescriptor, size: 0)
}
extension CGAffineTransform {
static func skew(c: CGFloat, b: CGFloat) -> CGAffineTransform {
var transform = CGAffineTransform.identity
transform.c = -c
transform.b = b
return transform
}
}
這是會有一個問題, 當(dāng)需要設(shè)置粗斜體的時候又該怎么處理?
直接使用 traitBold
處理
func setItalic(isBold: Bool) -> UIFont {
var symTraits = fontDescriptor.symbolicTraits
if isBold {
symTraits.insert([.traitBold])
}
var fontDescriptorVar = fontDescriptor.withSymbolicTraits(symTraits)
fontDescriptorVar = fontDescriptorVar?.addingAttributes([.matrix: CGAffineTransform.skew(c: -15*CGFloat.pi/180, b: 0)])
return UIFont(descriptor: fontDescriptorVar ?? fontDescriptor, size: 0)
}
在外界通過 UIFont.systemFont(ofSize: 17 weight: .bold)
設(shè)置, 如果是 調(diào)用 setItalic()
設(shè)置斜體的方式, 效果是粗體會消失
這時應(yīng)該使用 setItalic(isBold: Bool)
方法
3. 直接對控件進(jìn)行 CGAffineTransform
可以直接對 UILabel 等控件設(shè)置 transform 屬性進(jìn)行處理
var testLabel = UILable(frame: CGRect(x: 100, y: 100, width: 200, height: 40))
testLabel.text = "斜體設(shè)置"
let matrix = CGAffineTransformMake(1, 0, tanf(-15 * (CGFloat)M_PI / 180), 1, 0, 0)
testLabel.transform = matrix
self.view.addSubview(testLabel)
4. 對富文本進(jìn)行處理
對 NSAttributeString 設(shè)置 key 為 .obliqueness, value 為 傾斜角度的屬性值
類似:
let attr = NSAttributedString(string: "傾斜設(shè)置", attributes: [.obliqueness: 15*CGFloat.pi/180])
這是我們字體繪制文字時的解決方案