z
1.使用代碼進行計算
一般做cell自适應的時候,如果不是很複雜,都可以通過代碼計算文字所占的高度,
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dic = @{NSFontAttributeName : [UIFont systemFontOfSize:15]};// 設定字型
CGRect rect = [_dataSourceStr boundingRectWithSize:CGSizeMake(kScreenW - 40, 1000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];// options 一般NSStringDrawingUsesLineFragmentOrigin就可以傳回和合适的高度,
return rect.size.height + 90;// 文字所占高度加上别的控件所占高度
}
這個是一個比較好的方法,因為heightForRow在整個tableView調用很頻繁,當cell很多,并且計算比較耗時時(比如你要做一個比朋友圈還複雜的東西時)你可以開線程進行計算,然後放到一個數組(字典),那麼就不會造成主線程卡死
2.autolayout計算(iOS8)
這個就超簡單了在viewDidLoad裡面寫個這個就行了
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 100.0; // 這是一個估算cell高度的方法,不知道為什麼不寫這個方法就無法傳回正确高度,但是隻在iOS8以後适用
// 不要寫這個方法了
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
不過現在App大多從iOS7适配,是以适用性不強,是以就沒好好研究這個哦,就是設定限制時要注意讓cell的4邊必須有限制來限制,
3.autolayout計算(無限制)
這種方法是讓autolayout告訴你這個cell應該多高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
YDTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ydcell"];
cell.contentL.text = _dataSourceStr;
[cell layoutIfNeeded];// 必須實作這個,告訴cell布局改變
return CGRectGetMaxY(cell.contentL.frame) + 5;
}
這樣計算不用讓cell的4邊都有限制,如果限制會有沖突,但是你會發現cell沒有完全适配,因為還要在cell裡告訴cell他多寬,因為視圖還沒建立時,storyboard以為他的寬度是600,當然也可以給label拉一個寬的限制,限制label的寬度,
- (void)awakeFromNib {
CGRect frame = self.bounds;
frame.size.width = kScreenW;
self.bounds = frame;
}
注意:這種方法是非常耗性能的,并且也不能開線程,如果太多cell,會造成主線程長時間卡頓假死。如果經常重新整理整個tableView,更是會使整個APP體驗差很多,一種是自己寫個緩存,重新整理的時候取緩存就行了,但是也不好搞。
總結:如果寫一個擁有很多cell的,建議用第一種,因為性能很容易優化。如果隻有幾個cell,cell裡邊的布局又比較複雜,那麼第三種不失為一種簡單的方法。