天天看點

UITableViewCell 高度的自适應

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邊必須有限制來限制,

UITableViewCell 高度的自适應

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;
}
           
UITableViewCell 高度的自适應

這樣計算不用讓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裡邊的布局又比較複雜,那麼第三種不失為一種簡單的方法。