swift UILabel超出行數(shù)添加 查看全文

背景:項(xiàng)目中出現(xiàn)了 文本框設(shè)定為n行驻债,超出n行根吁,則在UILabel后邊添加 ...全文 按鈕字樣顽铸。

0.先看一下效果圖

1.首先得解決判斷文本框是否出現(xiàn)了...,在此闪幽,寫(xiě)了一個(gè)延展用來(lái)判定UILabel是否被截?cái)唷?/p>

2.在知道了UILabel是否被截?cái)嘀笊侗妫枰砑右粋€(gè) ...全文字樣。在這里盯腌,我采用了協(xié)議的方式進(jìn)行處理委可。

3.使用方法,如下圖

以下為源碼:

import UIKit

public protocol TruncatedText {

? ? var showInLabel:UILabel? {get}

}

extension TruncatedText {

? ? ///設(shè)置查看全文的label

? ? public func showTruncatedText(omit: String = "...", ?text: String = "全文? ? ", ?omitColor: UIColor? = UIColor.green, textColor: UIColor? = UIColor.green, ?backgroundColor: UIColor? = UIColor.red, ?target: Any?, ?action: Selector?) {

? ? ? ? guard let label =self.showInLabel else { return }

? ? ? ? let isTruncated = label.isTruncated

? ? ? ? if !isTruncated { return }

? ? ? ? let truncatedlabel = UILabel(frame:CGRect(x:0, y:0, width:0, height:0))

? ? ? ? let att1 = NSAttributedString(string: omit, attributes: [NSAttributedString.Key.foregroundColor : (omitColor ?? UIColor.blue), NSAttributedString.Key.font : label.font!])

? ? ? ? let att2 = NSAttributedString(string: text, attributes: [NSAttributedString.Key.foregroundColor : (textColor ?? UIColor.blue), NSAttributedString.Key.font : label.font!])

? ? ? ? let att = NSMutableAttributedString()

? ? ? ? att.append(att1)

?? ? ? ?att.append(att2)

? ? ? ? truncatedlabel.attributedText= att

? ? ? ? truncatedlabel.font= label.font

? ? ? ? truncatedlabel.textAlignment= .left

? ? ? ? label.addSubview(truncatedlabel)

? ? ? ? truncatedlabel.sizeToFit()

? ? ? ? truncatedlabel.bottom= label.height

? ? ? ? truncatedlabel.right= label.width

? ? ? ? truncatedlabel.backgroundColor= backgroundColor

? ? ? ? if let act = action {

? ? ? ? ? ? label.isUserInteractionEnabled = true

? ? ? ? ? ? truncatedlabel.isUserInteractionEnabled=true

? ? ? ? ? ? let tap =UITapGestureRecognizer(target: target, action: act)

? ? ? ? ? ? truncatedlabel.addGestureRecognizer(tap)

? ? ? ? }

? ? }

}

class ViewController: UIViewController, TruncatedText {

? ? var showInLabel:UILabel? {

? ? ? ? return self.label

? ? }

? ? private var label: UILabel!

? ? override func viewDidLoad() {

? ? ? ? super.viewDidLoad()

? ? ? ? self.navigationItem.title = "呵呵"

? ? ? ? self.view.backgroundColor = UIColor.white

? ? ? ? letw =self.view.frame.width-15*2

? ? ? ? label=UILabel(frame:CGRect(x:15, y:100, width: w, height:40))

? ? ? ? label.text = "測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試我依稀愛(ài)薩芬了多少加藍(lán)飛腊嗡,測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試我依稀愛(ài)薩芬了多少加藍(lán)飛着倾。我說(shuō)了哈哈哈哈"

? ? ? ? label.textColor = UIColor.black

? ? ? ? label.font=UIFont.systemFont(ofSize:14)

? ? ? ? label.textAlignment = .left

? ? ? ? label.backgroundColor = UIColor.yellow

? ? ? ? self.view.addSubview(label)

? ? ? ? label.numberOfLines = 2

? ? ? ? label.sizeToFit()

? ? ? ? label.width= w

? ? ? ? letisT =label.isTruncated

? ? ? ? if isT {

? ? ? ? ? ? self.showTruncatedText(omitColor:UIColor.red, textColor:UIColor.blue, backgroundColor:UIColor.white, target:self, action:#selector(self.trunctate(_:)))

? ? ? ? }

? ? }

? ? @objc private func trunctate(_send:UILabel) {

? ? ? ? print("看全文去")

? ? }?

}

extension UILabel {

? ? ///判斷l(xiāng)abel文字是否被截?cái)啵ㄊ欠癯霈F(xiàn)了...)

? ? var isTruncated: Bool {

? ? ? ? guard let labelText = text else{

? ? ? ? ? ? return false

? ? ? ? }

? ? ? ? guard let font =self.font else{

? ? ? ? ? ? return false

? ? ? ? }

? ? ? ? let rect =CGSize(width:self.bounds.width, height:CGFloat

? ? ? ? ? ? ? ? ? ? ? ? ? ? .greatestFiniteMagnitude)

? ? ? ? let labelTextSize = (labelText as NSString).boundingRect(with: rect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context:nil)

? ? ? ? let labelTextLines = Int(ceil(CGFloat(labelTextSize.height)/self.font.lineHeight))

? ? ? ? var labelShowLines = Int(floor(CGFloat(bounds.size.height) / self.font.lineHeight))

? ? ? ? if self.numberOfLines != 0 {

? ? ? ? ? ? labelShowLines =min(labelShowLines,self.numberOfLines)

? ? ? ? }

? ? ? ? return labelTextLines > labelShowLines

? ? }

}?

最后,附上 UIView的延展

extension UIView {

? ? ///獲取視圖的控制器

? ? public var viewController:UIViewController? {

? ? ? ? var next:UIResponder?

? ? ? ? next =self.next

? ? ? ? repeat{

? ? ? ? ? ? if (nextas?UIViewController)!=nil {

? ? ? ? ? ? ? ? return (nextas?UIViewController)

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? next = next?.next

? ? ? ? ? ? }

? ? ? ? }while next!=nil

? ? ? ? return (next as? UIViewController)

? ? }

? ? ///高度

? ? public var height: CGFloat {

? ? ? ? get{

? ? ? ? ? ? return self.frame.size.height

? ? ? ? }

? ? ? ? set{

? ? ? ? ? ? self.frame=CGRect(x:self.frame.origin.x, y:self.frame.origin.y, width:self.frame.width, height: newValue)

? ? ? ? }

? ? }

? ? ///寬度

? ? public var width: CGFloat {

? ? ? ? get{

? ? ? ? ? ? return self.frame.size.width

? ? ? ? }

? ? ? ? set{

? ? ? ? ? ? self.frame=CGRect(x:self.frame.origin.x, y:self.frame.origin.y, width: newValue, height:self.frame.height)

? ? ? ? }

? ? }

? ? ///頂部y

? ? public var top: CGFloat {

? ? ? ? get{

? ? ? ? ? ? return self.frame.origin.y

? ? ? ? }

? ? ? ? set{

? ? ? ? ? ? self.frame=CGRect(x:self.frame.origin.x, y: newValue, width:self.frame.width, height:self.frame.height)

? ? ? ? }


? ? }

? ? ///底部y

? ? public var bottom: CGFloat {

? ? ? ? get{

? ? ? ? ? ? return self.frame.origin.y + self.frame.height

? ? ? ? }

? ? ? ? set{

? ? ? ? ? ? let y = newValue-self.frame.height

? ? ? ? ? ? self.frame=CGRect(x:self.frame.origin.x, y: y, width:self.frame.width, height:self.frame.height)

? ? ? ? }


? ? }

? ? ///左邊x

? ? public var left: CGFloat {

? ? ? ? get{

? ? ? ? ? ? return self.frame.origin.x

? ? ? ? }

? ? ? ? set{

? ? ? ? ? ? self.frame=CGRect(x: newValue, y:self.frame.origin.y, width:self.frame.width, height:self.frame.height)

? ? ? ? }


? ? }

? ? ///右邊x

? ? public var right: CGFloat {

? ? ? ? get{

? ? ? ? ? ? return self.frame.origin.x + self.frame.width

? ? ? ? }

? ? ? ? set{

? ? ? ? ? ? let x = newValue-self.frame.width

? ? ? ? ? ? self.frame=CGRect(x: x, y:self.frame.origin.y, width:self.frame.width, height:self.frame.height)

? ? ? ? }

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末燕少,一起剝皮案震驚了整個(gè)濱河市卡者,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌客们,老刑警劉巖崇决,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件材诽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恒傻,警方通過(guò)查閱死者的電腦和手機(jī)脸侥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盈厘,“玉大人睁枕,你說(shuō)我怎么就攤上這事》惺郑” “怎么了外遇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)契吉。 經(jīng)常有香客問(wèn)我跳仿,道長(zhǎng),這世上最難降的妖魔是什么捐晶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任菲语,我火速辦了婚禮,結(jié)果婚禮上惑灵,老公的妹妹穿的比我還像新娘谨究。我一直安慰自己,他們只是感情好泣棋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著畔塔,像睡著了一般潭辈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澈吨,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天把敢,我揣著相機(jī)與錄音,去河邊找鬼谅辣。 笑死修赞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桑阶。 我是一名探鬼主播柏副,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚣录!你這毒婦竟也來(lái)了割择?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萎河,失蹤者是張志新(化名)和其女友劉穎荔泳,沒(méi)想到半個(gè)月后蕉饼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玛歌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年昧港,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片支子。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡创肥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出译荞,到底是詐尸還是另有隱情瓤的,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布吞歼,位于F島的核電站圈膏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篙骡。R本人自食惡果不足惜稽坤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糯俗。 院中可真熱鬧尿褪,春花似錦、人聲如沸得湘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淘正。三九已至摆马,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸿吆,已是汗流浹背囤采。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惩淳,地道東北人蕉毯。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像思犁,于是被迫代替她去往敵國(guó)和親代虾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349