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
}
}
UIMutiLineLabel的绘制
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这里主要说iOS原生地图iOS原生地图很有意思,在国内是用的高德地图,在国外才是苹果地图~就比如在国内你在手机上看...
- 概述 吐槽下IOS下 的图形绘图,代码冗长,不得不自己重新封装方法。整理形成本文。 绘制线 绘制矩形 垂直和居中绘...
- 1 收获 通过学习这次,又学到了实现一种简单的动画,我们可以通过绘画的方式来是实现动画。通过这里的学习我们不再仅仅...
- 前言从前面的课,我门能够的到知道ui的测量和布局,那么这次,我们首先来关注下我门的ui是怎么具体画出来的。那么在这...