typealias UIMultilineBlock = (CGPoint) -> Void
class UIMultilineLabel: UIView {
open var block: UIMultilineBlock?
open var text: String? {
didSet {
refreshContent()
}
}
open var font: UIFont? {
didSet {
refreshContent()
}
}
open var textColor: UIColor? {
didSet {
refreshContent()
}
}
open var textIndent: CGFloat? {
didSet {
refreshContent()
}
}
fileprivate(set) var endOffSet: CGPoint = CGPoint.zero
override var frame: CGRect {
didSet {
contentLab.frame = self.bounds
}
}
override init(frame: CGRect) {
super.init(frame: frame)
}
convenience init(text: String? = "",
font: UIFont? = UIFont.systemFont(ofSize: 15),
textColor: UIColor? = UIColor.black,
textIndent: CGFloat? = 0,
printBlock: UIMultilineBlock? = nil) {
self.init()
self.addSubview(contentLab)
self.text = text
self.font = font
self.textColor = textColor
self.textIndent = textIndent
self.block = printBlock
refreshContent()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
lazy private var contentLab: UILabel = {
let label = UILabel()
label.numberOfLines = 0
return label
}()
}
extension UIMultilineLabel {
private func refreshContent() {
guard let test = text else { return }
let paraStyle = NSMutableParagraphStyle()
paraStyle.alignment = .left
if let firstLineHeadIndent = textIndent {
paraStyle.firstLineHeadIndent = firstLineHeadIndent
}
var dic: [NSAttributedString.Key : Any]? = [NSAttributedString.Key.paragraphStyle: paraStyle]
if let testColor = textColor {
dic?[NSAttributedString.Key.foregroundColor] = testColor
}
if let testFont = font {
dic?[NSAttributedString.Key.font] = testFont
}
contentLab.attributedText = NSAttributedString(string: test, attributes: dic)
let lineWholeSize = textSize(text: test, font: font ?? UIFont.systemFont(ofSize: 15), width: CGFloat(MAXFLOAT), height: 20)
print(lineWholeSize)
let lineSingleSize = textSize(text: test, font: font ?? UIFont.systemFont(ofSize: 15), width: 393, height: CGFloat(MAXFLOAT))
print(lineSingleSize)
let indent = textIndent ?? 0
if lineWholeSize.width + indent <= lineSingleSize.width {
// 没有换行
endOffSet = CGPointMake(contentLab.frame.origin.x + lineWholeSize.width + indent, contentLab.frame.origin.y)
} else {
// 已经换行
let a = Int((lineWholeSize.width + indent) / lineSingleSize.width)
let distance = lineWholeSize.width + indent - lineSingleSize.width * CGFloat(a)
let x = distance
let y = lineSingleSize.height - lineWholeSize.height
endOffSet = CGPointMake(x, y)
}
block?(endOffSet)
}
private func textSize(text: String, font: UIFont, width: CGFloat, height: CGFloat) -> CGSize {
return text.boundingRect(with: CGSize(width: width, height: height), options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil).size
}
}
网友评论