UITableView
,在使用當(dāng)中經(jīng)常會遇到一些根據(jù)數(shù)據(jù)源動態(tài)調(diào)節(jié)cell
的高度摔吏,這種情況在 cell
上加載文字信息尤為常見鸽嫂,這里我總結(jié)兩種自己經(jīng)常用的方法。
3.31更新:無論哪種方法加上
self.tableView.estimatedRowHeight = kScreenHeight;
的運(yùn)行效率更高征讲【菽常可以減少計(jì)算量。內(nèi)存黑CPU在多row
下都有下降-
兼容iOS8之前版本
主要方法:
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
NSString
的對象方法诗箍,可以計(jì)算字符串在UILable
固定寬度癣籽、固定字體大小下所需的size
,返回值是CGRect
類型滤祖,但我們一般只需要高度就可以了筷狼。
這里我自定義一個TableViewCell
label
高度不做約束下面的label
要對cell
的ContentView
作底部約束匠童。數(shù)據(jù)源:
self.dataSource = @[@"The first step to creating a fancy animation was creating a UITableViewCell (called BookCell) with flexible constraints. By flexible, I mean that no constraint was absolutely required. The cell included a yellow subview subview with a collapsible height constraint — the height constraint always has a constant of 0, and it initially has a priority of 999. Within the collapsible subview, no vertical constraints are required. We set the priority of all the internal vertical constraints to 998.", @"如《廣東省工資支付條例》第三十五 條非因勞動者原因造成用人單位停工埂材、停產(chǎn),未超過一個工資支付周期(最長三十日)的汤求,用人單位應(yīng)當(dāng)按照正常工作時(shí)間支付工資俏险。超過一個工資支付周期的,可以根據(jù)勞動者提供的勞動扬绪,按照雙方新約定的標(biāo)準(zhǔn)支付工資竖独;用人單位沒有安排勞動者工作的,應(yīng)當(dāng)按照不低于當(dāng)?shù)刈畹凸べY標(biāo)準(zhǔn)的百分之八十支付勞動者生活費(fèi)挤牛,生活費(fèi)發(fā)放至企業(yè)復(fù)工莹痢、復(fù)產(chǎn)或者解除勞動關(guān)系。,來看看勞動法克林頓刷卡思考對方卡拉卡斯的樓房卡拉卡斯的瘋狂拉薩的罰款 ,中秋節(jié)、十一假期分為兩類格二。一類是法定節(jié)假日劈彪,即9月30日(中秋節(jié))、10月1日顶猜、2日沧奴、3日共四天為法定節(jié)假日;另一類是休息日,即10月4日至10月7日為休息日长窄。"];
然后關(guān)鍵的計(jì)算的
cell
的高度部分了:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *str1 = self.dataSource[0];
NSString *str2 = self.dataSource[1];
CGFloat height1 = [str1 boundingRectWithSize:CGSizeMake(kScreenWidth - 8, 99999) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:13]} context:nil].size.height;
CGFloat height2 = [str2 boundingRectWithSize:CGSizeMake(kScreenWidth - 8, 99999) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:13]} context:nil].size.height;
return height1 + height2 + 145 - 16 * 2;
}
其中CGSizeMake(kScreenWidth - 8, 99999)
部分width
參數(shù)屈居于cell
中的label
距離cell.contentView
邊緣距離滔吠,需要注意的是,如果我們用xib
做約束
Constrain to margins
打上對勾時(shí)默認(rèn)距離變遠(yuǎn)8像素挠日,然后return height1 + height2 + 145 - 16 * 2;
中145室xib中cell
的高度疮绷,16是label
在不加高度約束時(shí)的默認(rèn)高度,這樣就完成了嚣潜。運(yùn)行出來就是我們想要的結(jié)果
-
只兼容兼容iOS8之后的版本
主要方法:
self.tableView.estimatedRowHeight = kScreenHeight;
self.tableView.rowHeight = UITableViewAutomaticDimension;
把- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
注掉冬骚,直接運(yùn)行,也能得到上面的效果懂算。
Demo地址:https://github.com/ChengLuffy/UITableViewCellAutoHeight.git