如何解決富文本設(shè)置行間距的單行帶間距問題

最近因?yàn)橐{(diào)UILabel的行間距時,碰到了個問題,就是當(dāng)文本時中文時,且只有一行時還是有行間距,由于對 TextKit 和 CoreText 的研究比較少,找了些資料,自己寫了比較笨,但也比較簡單的方法。具體是給 NSMutableAttributedString 擴(kuò)展添加兩個方法。
代碼見下面:

extension NSMutableAttributedString {
   /**
     根據(jù)限制寬度,計(jì)算富文本的高度
     - 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:    文本顏色,默認(rèn)黑色
     - parameter lineSpaceing: 行間距, 默認(rèn)0
     - parameter alignment:    文本對齊,默認(rèn)左邊
     - parameter linebreak:    換行模式,默認(rèn)以單詞區(qū)分
     - returns: 富文本
     */
    convenience init(string: String,
                     font: UIFont,
                     limitWidth: CGFloat,
                     textColor: UIColor = UIColor.blackColor(),
                     lineSpaceing: CGFloat = 0 ,
                     alignment:NSTextAlignment = .Left ,
                     linebreak: NSLineBreakMode = .ByWordWrapping) {
        
        // 普通設(shè)置
        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
         // 當(dāng)文本不為1行時,增加行邊距
        paragraphStyle.lineSpacing =  selfHeight > oneLineHeight ? lineSpaceing : 0
        self.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: range)
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容