背景
首先看下圖:
這是一個非常簡單的cell。 但是這個cell高度是多少潮太,你怎么說管搪??
大家說:
1.直接寫死高度就好了啊铡买,不用計算了更鲁。方便省事。
2.根據(jù)文本計算cell高度奇钞。
3.用第三方庫澡为,使用自動布局方法,撐滿cell景埃,自動有高度媒至,不用計算。
逐一分析:
1.cell高度不能寫死谷徙,需求說要根據(jù)文本內(nèi)容靈活自適應高度拒啰。
3.這個利用自動布局,這里不多說了完慧。
2.利用文本計算出每個Label的高度谋旦,從而確定cell高度。
這里有一個問題屈尼, 你究竟采用什么方法計算文本高度呢册着?
<1>. 使用boundingRectWithSize:
方法計算
CGFloat height = [self.label.text boundingRectWithSize:CGSizeMake(SCREEN_WIDTH - 30, MAXFLOAT)
options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin
attributes:@{ NSFontAttributeName : self.label.font } context:nil].size.height;
這里不是特別準確,最好加一個offset值最好脾歧。
但是:這也不符合需求定位甲捏。 需求是文本最多顯示兩行,多余兩個就...省略涨椒。
那這里就有問題了: 當文本剛好1行或是2行的這是沒有問題的摊鸡,但是當文本多余兩行的話,就不行了蚕冬,明顯高了免猾。
<2>.使用UILabel的intrinsicContentSize
屬性來計算高度
height = [self.label intrinsicContentSize].height;
但是:這樣計算也有問題,這個屬性只能計算一行文本的高度囤热。 (這種說法其實是不正確的猎提,intrinsicContentSize可以計算出ULabel的高度,但是要向下面說的需要多設置preferredMaxLayoutWidth
屬性旁蔼。)
這時候你又說了锨苏,那我這樣計算:
height = [self.label intrinsicContentSize].height * self.label.numberOfLines;
但是:這樣你在初始化UILabel的時候疙教,就已經(jīng)確定了numberOfLines = 2
的值,當文本只有一行的時候伞租,就多計算了一行贞谓。也不行。
<3>.我用1 2方法綜合起來計算
//先算出文本寬度葵诈,看是否大于1行
CGFloat width = [self.label.text boundingRectWithSize:CGSizeMake(SCREEN_WIDTH - 30, MAXFLOAT) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.label.font} context:nil].size.width;
height = [self.questionLabel intrinsicContentSize].height * (width > (SCREEN_WIDTH - 30) ? 2 : 1);
這樣子確實可以作喘,不過有些麻煩哈。
相對簡單計算方法
還是使用intrinsicContentSize
方法窖贤。 不過要在初識化UILabel的時候多設置一個屬性preferredMaxLayoutWidth
赃梧。
看官方解釋:
// Support for constraint-based layout (auto layout)
// If nonzero, this is used when determining -intrinsicContentSize for multiline labels
@property(nonatomic) CGFloat preferredMaxLayoutWidth NS_AVAILABLE_IOS(6_0);
初始化UILabel的時候設置這個屬性的值為UILabel的寬度即可李根,然后通過intrinsicContentSize
方法就可以準確計算出文本的高度了。
更簡單的方法
使用sizeThatFits:
方法計算,不用額外設置上面那些不用的屬性所森。
直接掉用下面方法即可焕济。
height = [self.label.text sizeThatFits:CGSizeMake(SCREEN_WIDTH - 30, MAXFLOAT) ].height;