iOS8新特性Self Sizing Cells,使用estimatedRowHeight自適應cell

本文章主要介紹iOS8之后蘋果推出的一個新特性Self Sizing Cells,意思就是讓cell自己計算自己的高度,當我們在cell里面添加完所需控件,并約束好位置之后,我們只需要設置

tableView.estimatedRowHeight = 44.0f;//推測高度,必須有,可以隨便寫多少
tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默認就是這個值,可以省略
這兩句代碼之后,即可放心的往cell的控件里面加上內容,cell會根據(jù)內部所有控件的高度動態(tài)的計算自己的高度從而顯示出來。這個就有點類似于html5中的body,會根據(jù)自己內部的內容調整自己的大小。這就給iOS開發(fā)者提供了很大的便利,不再需要之前復雜的自適應計算方法。但是要注意的是,這個需要在iOS8之后才可以使用,如果你的應用要適配iOS8之前的版本,可能無法使用該機制,當然也可以對系統(tǒng)版本進行判斷之后再決定使用哪一套適配方案。廢話不多說,貼代碼。RootViewController:

import "RootViewController.h"

import "TestTableViewCell.h"

@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic,strong) NSMutableArray * dataSource;

@end

@implementation RootViewController

  • (void)viewDidLoad {
    [superviewDidLoad];

    //建立一個隨機字符串的數(shù)據(jù)源
    self.dataSource = [NSMutableArraynew];
    NSString * str1 =@"ell中有上下兩個 Label,上面的Label只有一行文本(lines為1),所以高度在運行時不會改變,但下面的Label是多行文本(lines為0),運行時其高度會根據(jù)文本內容自動增長。左圖中的自動布局是正確的,因此運行時單元格能夠自適應高度。這是因為iOS能夠根據(jù)cell的contentView中的各個子View計算出cell的正常高度,計算方式為:cell高度 = 第1個Label的top+第1個Label高度+第2個Label的top+第2個Label高度(根據(jù)內容自動計算)+第2個Label的bottom但是當我們將第2個Label的top約束(或者bottom約束)刪除,如右圖所示,我們已經(jīng)把圖中紅框所示位置的約束刪除了,則iOS無法計算單元格的高度了。因為上述公式中的一個變量缺失。這樣運行時表格中的所有cell都是固定高度,cell之間會發(fā)生重疊,同時控制臺會報錯:Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.";
    NSString * str2 =@"運行時其高度會根據(jù)文本內容自動增長。左圖中的自動布局是正確的,因此運行時單元格能夠自適應高度。這是因為iOS能夠根據(jù)cell的contentView中的各個子View計算出cell的正常高度";
    NSString * str3 =@"如右圖所示,我們已經(jīng)把圖中紅框所示位置的約束刪除了,則iOS無法計算單元格的高度了。因為上述公式中的一個變量缺失。這樣運行時表格中的所有cell都是固定高度,cell之間會發(fā)生重疊,同時控制臺會報錯:Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.";
    for (int i = 0; i < 24; i++) {
    if (i%3 == 0) {
    [self.dataSourceaddObject:str1];
    }else if (i%3 == 1){
    [self.dataSourceaddObject:str2];
    }else{
    [self.dataSourceaddObject:str3];
    }
    }

    //創(chuàng)建一個表格視圖
    UITableView * tableView = [[UITableViewalloc] initWithFrame:[UIScreenmainScreen].boundsstyle:UITableViewStylePlain];
    tableView.dataSource = self;
    tableView.delegate = self;
    [tableView registerNib:[UINibnibWithNibName:@"TestTableViewCell"bundle:nil]forCellReuseIdentifier:@"CELLID"];//TestTableViewCell是使用xib創(chuàng)建,可以直接拉約束

    //關鍵就是這兩句代碼,cell拉好約束寫上這兩句代碼,然后它就會根據(jù)自己的內容計算高度了
    tableView.estimatedRowHeight = 44.0f;//推測高度,必須有,可以隨便寫多少
    tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默認就是這個值,可以省略

    [self.viewaddSubview:tableView];

}

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    returnself.dataSource.count;
    }

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    TestTableViewCell * cell = [tableViewdequeueReusableCellWithIdentifier:@"CELLID"forIndexPath:indexPath];
    cell.label1.text =@"測試";
    cell.label2.text =self.dataSource[indexPath.row];
    return cell;
    }

TestTableViewCell是使用xib進行創(chuàng)建的,里面有兩個cell,拉好約束,一定要注意拉約束要遵循從左到右,從上到下的規(guī)律。最終運行效果如下:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容