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

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

作者: Mzxer | 来源:发表于2016-09-24 21:58 被阅读1927次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/sloxyttx.html