前言
針對超過指定行數(shù)顯示展開蕉世,點擊后顯示全文见坑,簡單封裝了一個控件琼蚯,在此拋磚引玉供大家參考违施。
特性
- 支持富文本
- 支持內(nèi)邊距
- 支持
AutoLayout
原理
使用CoreText
切割字符串后,計算截斷符的寬度尚蝌,按照寬度重新生成新的字符串迎变。這里核心在于如何保障新的字符串不會超出設(shè)置的行數(shù)。核心代碼參考如下:
func reload() {
guard let attributedText = attributedText?.addAttributes({ $0.font(textLabel.font) }) else { return }
guard Thread.isMainThread else { return DispatchQueue.main.async { self.reload() } }
setNeedsLayout()
layoutIfNeeded()
let width = textLabel.bounds.width
let lines = attributedText.lines(width)
if numberOfLines > 0,
lines.count >= numberOfLines {
let additionalAttributedText = isOpen ? truncationToken.close : truncationToken.open
let length = lines.prefix(numberOfLines).reduce(0, { $0 + CTLineGetStringRange($1).length })
textLabel.attributedText = additionalAttributedText
let truncationTokenWidth = textLabel.sizeThatFits(.zero).width
let maxLength = isOpen ? attributedText.length : min(CTLineGetStringIndexForPosition(lines[numberOfLines - 1], CGPoint(x: width - truncationTokenWidth, y: 0)), length) - 1
displayAttributedText = {
let attributedText = NSMutableAttributedString(attributedString: attributedText.attributedSubstring(from: NSRange(location: 0, length: maxLength)))
attributedText.append(additionalAttributedText)
return attributedText
}()
}
textLabel.attributedText = displayAttributedText
}
效果圖
Demo
核心代碼已經(jīng)貼出飘言,完整代碼請查看----->>>GitHub衣形,如果對你有所幫助,歡迎Star姿鸿。