最近因为要调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)
}
/**
创建一个带行间距的富文本
- parameter string: 普通字符串
- parameter font: 类型
- parameter limitWidth: 字符串限制宽度
- parameter textColor: 文本颜色,默认黑色
- parameter lineSpaceing: 行间距, 默认0
- parameter alignment: 文本对齐,默认左边
- parameter linebreak: 换行模式,默认以单词区分
- 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)
}
}