動態(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: 限定寬度