UILabel換行與多行文字顯示處理

轉載自: https://blog.csdn.net/shorewb/article/details/52081173

需求1 只顯示一行文字

只顯示一行文字其實很好處理,在剛開始學習UILabel的使用時我們已經經常會遇到這種情況,那就是當UILabel的寬度(XXLabel.frame.size.width)不能完全容納所有的文字時,文字就不會全部顯示,在width之外的文字將不會顯示,而用 … 來代替,所以說這是一種很好處理的情況。

你需要做的只是:

  1. 首先設置好UILabel的frame
  2. 把需要顯示的文字賦值給UILabel的text屬性
  3. done

這裏還有一種情況就是,當文字的長度其實是不能充滿你一開始設置的frame的,而你需要使UILabel的長度適應文字的長度,這時你只需要把第三步的改爲[XXLbel sizeTofit]即可,我在項目中遇到這種情況是在UILabel之後還需緊跟一個UIImage需要顯示,這樣設置可以使UILabel的長度根據文字來進行自適應,UIImage可以正常進行佈局

需求2 需要顯示全部文字

有時候我們會遇到這樣一種情況,在某個ViewController中一些文字不能完全顯示,我們點擊顯示全部,文字則會完全展開,大概就類似於微信朋友圈中點擊查看全部,文字就完全顯示,這樣的情況怎麼處理呢? 
其實這種情況也比較好處理,我們只需讓UILabel完全自適應文字即可

你需要做的是:

  1. 首先設置UILabel的frame(其實這裏只需要設置UILabel的寬度即可)
  2. 然後設置UILabel的numberOfLines屬性爲0(XXLabel.numberOfLines = 0)
  3. 使UILabel自適應文字([XXLabel sizeToFit])

這裏需要解釋一下numberOfLines = 0,在UILabel.h文件中可以發現蘋果是這樣解釋這個屬性的:

這個屬性是用來決定UILabel中文字有幾行需要繪製,同時決定當UILabel的sizeToFit方法被調用時該怎麼做。numberOfLines的默認值是1,即如果你不設置這個屬性的話,UILabel默認只顯示一行文字。接下來的一句話需要注意,當這個值被設置爲0時代表沒有限制,可以顯示任意多行,根據你的文字來設置多少行,如果文字的高度超過一行的高度、或者UILabel的高度小於文字的高度,文字就會使用UIlabel的lineBreakMode的屬性值來對文字進行刪節

注意到上面一段文字中的最後一段話,我們發現如果文字的高度超過一行的高度、或者UILabel的高度小於文字的高度,文字就會使用UIlabel的lineBreakMode的屬性值來對文字進行刪節,因此如果你還希望使用…來代表未顯示的字符的話,需要將UILabel的lineBreakMode屬性設置爲NSLineBreakByTruncatingTail

lineBreakMode的類型是一個枚舉值,類型是NSLineBreakMode,在這裏貼出NSLineBreakMode的定義,可以根據需要使用不同的枚舉值

typedef NS_ENUM(NSInteger, NSLineBreakMode) {
    NSLineBreakByWordWrapping = 0,  // Wrap at word boundaries, default
    NSLineBreakByCharWrapping,     // Wrap at character boundaries
    NSLineBreakByClipping,         // Simply clip
    NSLineBreakByTruncatingHead,    // Truncate at head of line: "...wxyz"
    NSLineBreakByTruncatingTail,    // Truncate at tail of line: "abcd..."
    NSLineBreakByTruncatingMiddle   // Truncate middle of line:  "ab...yz"
} NS_ENUM_AVAILABLE(10_0, 6_0);

需求3 服務器端控制顯示多少行文字

遇到這種需求的時候不要慌,首先需要跟PM詳細詢問,是服務器控制某個頁面所有的UILabel都使用一個值來控制行數顯示還是針對每一個UILabel都有一個相應的值來進行控制行數顯示。其實這個顯示行數的沒有必要由服務器來控制,客戶端完全可以做這樣的事,用不到服務器,服務器只要把需要的顯示的文字傳回來就行了,這種情況也是因爲PM對技術不太屬性導致的,所以一定要與PM說清楚這一點,不然有可能你最終寫出來的代碼需要重寫。

好了,現在我們假定PM一定要服務器控制顯示多少行,我們也有相應的做法:

  1. 設置UILabel的frame(不能只設置寬度,高度也要設置,原因在下面會說到)
  2. 從服務器返回的值中解析出需顯示的行數
  3. 將UILabel的numberOfLines設置爲第2步中的行數
  4. 對行數進行判斷,如果行數爲1,就不用sizeToFit(因爲numberOfLines = 0時,調用sizeToFit就不會顯示…),否則,需要調用[XXLabel sizeToFit]

搞定

需求4 最多顯示5行,文字不夠5行的有多少行顯示多少行

這種需求比較常見,比如說微信朋友圈中,超過多少行就會顯示收起按鈕,剩下的文字應…來代替,沒超過那個行數就有多少行顯示多少行,有可能在做社區啊、貼吧啊之類的地方會遇到這樣的需求

遇到這樣的需求也不要慌,也有相應的解決辦法

  1. 同樣是設置UILabel的Frame(不用設置高度)
  2. 計算出完全展示文字需要多少高度,這裏需要使用NSString的boundingRectWithSize:options:attributes:context:方法,將size的寬度使用UILabel.frame.size.width,高度可以設置一個很大的值(10000),如果你對計算文字顯示高度的選項有需求可以將指定的NSStringDrawingOptions類型的值傳入option參數(注意這些值可以同時使用),如果你對文字的屬性有要求可以將相應的屬性傳入attribute參數,context參數一般可以傳nil(因爲我發現傳nil就能完成任務,對context參數沒有詳細瞭解,挖個坑,以後回來補上)
  3. 使用UIFont的lineHeight屬性得到每一行的高度
  4. 使用第2步中得到的文字高度除以每一行的高度即可得到文字的行數
  5. 對第4步中得到的行數進行判斷,如果 行數 <= 5,UILabel的numberOfLines屬性設置爲0,否則UILabel的numberOfLines屬性設置爲5
  6. 調用[XXUILabel sizeToFit]方法

搞定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章