關于動態獲取字符串寬度和高度的一點內容

動態獲取字符串寬度和高度在UI搭建過程中是比較常用的知識點。在之前的工作過程中經常遇到的場景,一是在需要用到搜索頁面的時候,需要提示一些熱門標簽,如簡書App的搜索頁面,本身熱門標簽的長度是不固定的,所以必須要動態判斷字符串的寬度。關于動態獲取字符串高度,比較常見的場景則是用于評論等交互場景,根據用戶輸入評論內容的不同,動態顯示高度。

1.動態獲取字符串高度。

先上代碼,然后對幾個重點參數進行以下分析:

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
}

這段代碼是前段時間最新的一個項目:中國孔子網App里面的一段代碼,主要應用在關于儒學經典的一些見解,還有評論框,實現的效果還是比較理想的。

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

函數的參數包含三個:第一個“title”參數,傳入的是需要進行動態計算高度的字符串內容;第二個參數“size”,代表的是需要傳入字符串的字號大小,不同的字號占用的寬度和高度是不同的,這點是非常顯而易見的;第三個參數“width”,則是代表你所設定的加載字符串的控件的寬度。

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

本行代碼是獲取到通過傳入的“size”參數,獲取到系統字號,方便下面的代碼使用。

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

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

return size.height+30

最后的這行代碼,因為需要在加載的時候,上下留有一定的空白區域,純是為了美觀,所以設定高度可以基本高度的基礎上額外加一點。

幾行簡單的代碼就實現了動態獲取字符串高度。

2.動態獲取字符串寬度。

還是先上代碼,然后你就會發現,其實跟獲取動態高度的代碼如出一轍:

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
}

區別還是有一點的,比如下面:

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

相對于獲得高度,你無需去額外傳入“height”參數,因為動態獲取寬度,本身就是適用于較為簡短的字符串,因此,基本不會因為控件高度問題影響到字符串寬度的顯示,萬一影響到了,那你應該考慮的就變成了如何動態獲取高度了,不是嗎?當然,為了嚴謹,添加“height”參數也是可以的,參照動態獲取字符串高度即可。

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

如果有什么需要補充的,請添加我的企鵝:591383605,互勉共進。

2017 - 10 - 25: 在網上新看到一個比較不錯的動態獲取高度的方法,補充一下:

// - 獲取動態高度
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
} 

調用

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容