如何解决富文本设置行间距的单行带间距问题

2016-09-24  本文已影响1927人  Mzxer

最近因为要调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)
    }
}
上一篇下一篇

猜你喜欢

热点阅读