字體
在 iOS 9 中,新增了兩個(gè)字體家族San Francisco(英文)和PingFangSC(簡(jiǎn)體中文)。
其中 San Francisco 分為.SFUIText和.SFUIDisplay兩種字體;PingFangSC 分為PingFangSC-Regular、PingFangSC-Light和PingFangSC-Medium三種字體。
在 iOS 9 之前,常用英文字體家族為Helvetica Neue和Helvetica;常用簡(jiǎn)體中文字體為STHeitiSC。
其中 STHeitiSC 分為STHeitiSC-Light和STHeitiSC-Medium兩種字體;STHeitiSC 字體家族在 iOS 9 中已被移除。
這四種字體的基本屬性如下:(表格中的值均為系數(shù),乘以字號(hào)可以得到真實(shí)的值)
| 屬性 | .SFUIText / .SFUIDisplay | Helvetica Neue / Helvetica | PingFangSC | STHeitiSC-Light / STHeitiSC-Medium |
|---|---|---|---|---|
| ascender | 0.952148 | 0.952000 / 0.920020 | 1.060000 | 0.860000 |
| capheight | 0.704590 | 0.714000 / 0.717285 | 0.860000 | 0.778000 / 0.718000 |
| xheight | 0.526367 / 0.507812 | 0.517000 / 0.522949 | 0.600000 | 0.591000 / 0.531000 |
| base-line | 0 | 0 | 0 | 0 |
| descender | -0.241211 | -0.213000 / -0.229980 | -0.340000 | -0.140000 |
| lineheight | 1.193359 | 1.165000 / 1.150000 | 1.400000 | 1.000000 |
| leading | 0 | 0.028000 / 0 | 0 | 1.000000(0.03) |
.SFUIText 與 .SFUIDisplay 的差異主要是字體間距的不同,Text 字體間距較大,使得在小的字體中更加易讀。
在APP里面使用了 SF 字體后,由操作系統(tǒng)自動(dòng)選擇使用 .SFUIText 還是 .SFUIDisplay。當(dāng)字號(hào)小于20號(hào)時(shí),選擇 .SFUIText,否則選擇 .SFUIDisplay。
文本高度計(jì)算
規(guī)則如下:
- 文本為空時(shí),高度為字體的 lineHeight。
- 只有一行時(shí),高度為字體的 lineHeight + leading。
- 如果 leading=0 且 lineSpacing>0,高度為 lineHeight * numOfLines + lineSpacing * (numOfLines - 1)。
- 如果 leading=0 且 lineSpacing<=0,高度為 lineHeight * numOfLines。
- 如果 leading>0 且 lineSpacing<-leading,高度為 lineHeight * numOfLines。
- 如果 leading>0 且 lineSpacing<0 且 lineSpacing>=-leading,高度為 lineHeight * numOfLines + (lineSpacing + leading) * (numOfLines - 1)。
- 如果 leading>0 且 lineSpacing>=0 且 lineSpacing<=leading,高度為 lineHeight * numOfLines + leading * (numOfLines - 1)。
- 如果 leading>0 且 lineSpacing>leading,高度為 lineHeight * numOfLines + lineHeight * (numOfLines - 1)。
代碼:
func textHeight(numOfLines: Int, lineHeight: CGFloat, leading: CGFloat, lineSpacing: CGFloat) -> CGFloat {
if numOfLines == 0 {
return lineHeight
}
else if numOfLines == 1 {
return lineHeight + leading
}
if leading == 0 {
if linespacing > 0 {
return lineHeight * CGFloat(numOfLines) + linespacing * CGFloat(numOfLines - 1)
} else {
return lineHeight * CGFloat(numOfLines)
}
}
else if leading > 0 {
if linespacing < -leading {
return lineHeight * CGFloat(numOfLines)
}
else if linespacing < 0 {
return lineHeight * CGFloat(numOfLines) + (linespacing + leading) * CGFloat(numOfLines - 1)
}
else if linespacing <= leading {
return lineHeight * CGFloat(numOfLines) + leading * CGFloat(numOfLines - 1)
}
else {
return lineHeight * CGFloat(numOfLines) + linespacing * CGFloat(numOfLines - 1)
}
}
else {
fatalError("leading of font < 0")
}
}
其他需要注意的事項(xiàng):
- 計(jì)算文本高度時(shí),必須包含 NSStringDrawingUsesLineFragmentOrigin 參數(shù),否則只能是單行。
- 計(jì)算文本高度時(shí),如果不包含 NSStringDrawingUsesFontLeading 參數(shù),leading 為 0;否則取字體的 leading。
- Heiti SC 的 leading 值為 1.00,但參與計(jì)算的值是 0.03。
- iOS 9 開始 Heiti SC 會(huì)被強(qiáng)制替換為 PingFangSC。
- 由于 Heiti SC 的 lineHeight=1,而 PingFangSC 的 lineHeight=1.4,iOS 9 前后的漢字行間距存在差異。
- iOS 9 開始默認(rèn)英文字體為 SF 系列,原有的 Helvetica 系列仍然可以使用。
- San Francisco 系列中的 SF 用在 OS X 和 iOS 中,SF Compact 用在 Watch OS 中。