最近因為要調UILabel的行間距時谈喳,碰到了個問題粹舵,就是當文本時中文時钮孵,且只有一行時還是有行間距,由于對 TextKit 和 CoreText 的研究比較少眼滤,找了些資料巴席,自己寫了比較笨,但也比較簡單的方法诅需。具體是給 NSMutableAttributedString 擴展添加兩個方法情妖。
代碼見下面:
extension NSMutableAttributedString {
/**
根據限制寬度,計算富文本的高度
- parameter width: 限制寬度
- returns: 富文本高度
*/
func height(byLimitWidth width: CGFloat) -> CGFloat {
let constraintRect = CGSize(width: width, height: CGFloat.max)
let boundingBox = self.boundingRectWithSize(constraintRect, options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)
return ceil(boundingBox.height)
}
/**
創(chuàng)建一個帶行間距的富文本
- parameter string: 普通字符串
- parameter font: 類型
- parameter limitWidth: 字符串限制寬度
- parameter textColor: 文本顏色诱担,默認黑色
- parameter lineSpaceing: 行間距, 默認0
- parameter alignment: 文本對齊电爹,默認左邊
- parameter linebreak: 換行模式蔫仙,默認以單詞區(qū)分
- returns: 富文本
*/
convenience init(string: String,
font: UIFont,
limitWidth: CGFloat,
textColor: UIColor = UIColor.blackColor(),
lineSpaceing: CGFloat = 0 ,
alignment:NSTextAlignment = .Left ,
linebreak: NSLineBreakMode = .ByWordWrapping) {
// 普通設置
self.init(string: string)
let attributes = [NSFontAttributeName : font,
NSForegroundColorAttributeName: textColor]
let range = NSRange(location: 0, length: string.characters.count)
self.setAttributes(attributes, range: range)
// 獲取自己的高度和一行的高度
let oneLineAText = NSMutableAttributedString(string: "中文", attributes: attributes)
let oneLineHeight = oneLineAText.height(bylimitWidth: 1000)
let selfHeight = self.height(byLimitWidth: limitWidth)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = linebreak
paragraphStyle.alignment = alignment
// 當文本不為1行時,增加行邊距
paragraphStyle.lineSpacing = selfHeight > oneLineHeight ? lineSpaceing : 0
self.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: range)
}
}