關(guān)于動態(tài)獲取字符串寬度和高度的一點內(nèi)容

動態(tài)獲取字符串寬度和高度在UI搭建過程中是比較常用的知識點。在之前的工作過程中經(jīng)常遇到的場景淫痰,一是在需要用到搜索頁面的時候沸柔,需要提示一些熱門標簽循衰,如簡書App的搜索頁面,本身熱門標簽的長度是不固定的褐澎,所以必須要動態(tài)判斷字符串的寬度会钝。關(guān)于動態(tài)獲取字符串高度,比較常見的場景則是用于評論等交互場景,根據(jù)用戶輸入評論內(nèi)容的不同迁酸,動態(tài)顯示高度先鱼。

1.動態(tài)獲取字符串高度。

先上代碼奸鬓,然后對幾個重點參數(shù)進行以下分析:

func setUIViewHeight(_ title:String,size:CGFloat,width:CGFloat) -> CGFloat{
    let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: size)]
    let size = title.boundingRect(with: CGSize(width: width, height: 10000000), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil).size
    return size.height+30
}

這段代碼是前段時間最新的一個項目:中國孔子網(wǎng)App里面的一段代碼焙畔,主要應(yīng)用在關(guān)于儒學(xué)經(jīng)典的一些見解,還有評論框串远,實現(xiàn)的效果還是比較理想的宏多。

 setUIViewHeight(_ title:String,size:CGFloat,width:CGFloat) -> CGFloat

函數(shù)的參數(shù)包含三個:第一個“title”參數(shù),傳入的是需要進行動態(tài)計算高度的字符串內(nèi)容澡罚;第二個參數(shù)“size”绷落,代表的是需要傳入字符串的字號大小,不同的字號占用的寬度和高度是不同的始苇,這點是非常顯而易見的;第三個參數(shù)“width”筐喳,則是代表你所設(shè)定的加載字符串的控件的寬度催式。

let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: size)]

本行代碼是獲取到通過傳入的“size”參數(shù),獲取到系統(tǒng)字號避归,方便下面的代碼使用荣月。

let size = title.boundingRect(with: CGSize(width: width, height: 10000000), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil).size

這一行代碼才是重中之重,各種參數(shù)的準備工作工作都是為了本行代碼而準備梳毙,其中比較難以理解的是“height: 10000000”哺窄,這里是設(shè)定一個可預(yù)測的值,即為需要加載字符串的控件可能達到的最大高度账锹,一旦超出了這個值萌业,空間的高度仍然是按照“height”后面設(shè)定的值來顯示,因此奸柬,各位可以根據(jù)不同的需求來設(shè)定一個比較合適的值生年。

return size.height+30

最后的這行代碼,因為需要在加載的時候廓奕,上下留有一定的空白區(qū)域抱婉,純是為了美觀,所以設(shè)定高度可以基本高度的基礎(chǔ)上額外加一點桌粉。

幾行簡單的代碼就實現(xiàn)了動態(tài)獲取字符串高度蒸绩。

2.動態(tài)獲取字符串寬度。

還是先上代碼铃肯,然后你就會發(fā)現(xiàn)患亿,其實跟獲取動態(tài)高度的代碼如出一轍:

func setUIViewWidth(_ title:String,size:CGFloat) ->CGFloat{
    let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: size)]
    let size = title.boundingRect(with: CGSize(width: Swidth-16, height: 1000), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil).size
    return size.width+10
}

區(qū)別還是有一點的,比如下面:

setUIViewWidth(_ title:String,size:CGFloat) ->CGFloat

相對于獲得高度缘薛,你無需去額外傳入“height”參數(shù)窍育,因為動態(tài)獲取寬度卡睦,本身就是適用于較為簡短的字符串,因此漱抓,基本不會因為控件高度問題影響到字符串寬度的顯示表锻,萬一影響到了,那你應(yīng)該考慮的就變成了如何動態(tài)獲取高度了乞娄,不是嗎瞬逊?當(dāng)然,為了嚴謹仪或,添加“height”參數(shù)也是可以的确镊,參照動態(tài)獲取字符串高度即可。

記錄一點開發(fā)過程中比較常用的資源范删,既能方便自己查閱蕾域,也希望能盡可能地幫助到跟我一樣的朋友。

如果有什么需要補充的到旦,請?zhí)砑游业钠簌Z:591383605旨巷,互勉共進。

2017 - 10 - 25: 在網(wǎng)上新看到一個比較不錯的動態(tài)獲取高度的方法,補充一下:

// - 獲取動態(tài)高度
func getLabelSize(text:String,fontSize:CGFloat,width:CGFloat)->CGFloat{
    let size = CGSize(width: width, height: 100000)
    let labelSize = sizeWith(text: text as NSString, maxSize: size, fontSize: 15)
    return labelSize.height
}

// - 計算文字的大小
func sizeWith(text:NSString,maxSize:CGSize,fontSize:CGFloat)->CGSize{
    //計算文本的大小
    let nameSize  = text.boundingRect(with: maxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: fontSize)], context: nil).size
    return nameSize
} 

調(diào)用

getLabelSize(text:String,fontSize:CGFloat,width:CGFloat)->CGFloat 

進行獲取,其中參數(shù)含義為:
// - text: 文本內(nèi)容
// - fontSize: 字體大小
// - width: 限定寬度

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末添忘,一起剝皮案震驚了整個濱河市采呐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搁骑,老刑警劉巖斧吐,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仲器,居然都是意外死亡煤率,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門乏冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涕侈,“玉大人,你說我怎么就攤上這事煤辨∩烟危” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵众辨,是天一觀的道長端三。 經(jīng)常有香客問我,道長鹃彻,這世上最難降的妖魔是什么郊闯? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上团赁,老公的妹妹穿的比我還像新娘育拨。我一直安慰自己,他們只是感情好欢摄,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布熬丧。 她就那樣靜靜地躺著,像睡著了一般怀挠。 火紅的嫁衣襯著肌膚如雪析蝴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天绿淋,我揣著相機與錄音闷畸,去河邊找鬼。 笑死吞滞,一個胖子當(dāng)著我的面吹牛佑菩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裁赠,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼倘待,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了组贺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祖娘,失蹤者是張志新(化名)和其女友劉穎失尖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渐苏,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡掀潮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼富。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪吧。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠眉,靈堂內(nèi)的尸體忽然破棺而出薯鼠,到底是詐尸還是另有隱情,我是刑警寧澤械蹋,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布出皇,位于F島的核電站,受9級特大地震影響哗戈,放射性物質(zhì)發(fā)生泄漏郊艘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纱注。 院中可真熱鬧畏浆,春花似錦、人聲如沸狞贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斥滤。三九已至将鸵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑颇,已是汗流浹背顶掉。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挑胸,地道東北人痒筒。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像茬贵,于是被迫代替她去往敵國和親簿透。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容