使用autolayout實現(xiàn)UITabelViewCell動態(tài)高度

在iOS8之前我們需要動態(tài)的計算每個cell的高度,但是iOS8之后,我們就可以使用autolayout自動計算cell的高度, 把這個煩人的高度交給autolayout就行了.

原理很簡單.為了更加簡明的實現(xiàn)效果,就隨便寫一個小demo

首先我們看一下最終效果

最終效果

cell的樣式:

cell的樣式

接下來我們來設(shè)置各個控件的約束
1.設(shè)置Image約束:距屏幕上邊和左邊各10個像素,寬高都是45像素

Image的約束

2.設(shè)置titleLabel約束:距屏幕上邊和右邊各10個像素,距image右邊10像素,不要給高度

titleLabel的約束

3.設(shè)置contentLabel約束:距fromLabel底部10像素,距屏幕左邊和右邊各10像素,

注意:因為contentLabel是最下面的控件,所以一定要設(shè)置他距cell底部的距離(只有設(shè)置這個距離之后,contentLabel高度變化時,他才會去擠壓cell,使cell跟隨著變大)
contentLabel的約束

當(dāng)你設(shè)置玩這些,Xcode會給我們報一個錯誤:


Xcode報出的錯誤

我們點擊進(jìn)去按照xcode上給出的默認(rèn)解決辦法就好,我們的約束都沒有問題,為啥會還會出現(xiàn)這個問題呢,這個就跟Content Hugging Priority 和 Content Compression ResIstance Priority有關(guān)了


Content Hugging Priority 其實就是阻止view變大的力量蛉迹,Content Compression ResIstance Priority是阻止view變小的力量册烈。

由于我們把titleLabel和contentLabel都設(shè)置了距離cell右邊固定距離,所以他兩都有可以是自身變大的力量婿禽,且優(yōu)先級是1000赏僧,也就是說一旦文本內(nèi)容比較多,就會向下拉伸扭倾〉砹悖可是titleLabel和contentLabel都具有變大的力量,而且優(yōu)先級是一樣的膛壹,都是251驾中,當(dāng)出現(xiàn)都要變大時,xcode不知道該優(yōu)先拉伸哪一個為好模聋,所以也就拋出了錯誤肩民。我們只要把contentLabel的Vertical的優(yōu)先級調(diào)大一點就可以了(251->252)×捶剑或者把titleLabel的Vertical的優(yōu)先級調(diào)小一點(251->250)

我們可以看一下現(xiàn)在運行的效果



大家有沒有發(fā)現(xiàn)這個問題,如果標(biāo)題行數(shù)為2行或者以上就沒有問題,如果標(biāo)題為一行話,有些內(nèi)容就會把頭像的下面的部分覆蓋了

為什么會出現(xiàn)這個問題呢?這就要從設(shè)置contentLabe約束l開始說起了,我們設(shè)置contentLabel約束時候,只讓它距titleLabel的底部10個像素,沒有考慮到如果標(biāo)題的高度比頭像的高度小的情況,所以當(dāng)標(biāo)題高度比頭像高度小的話,contentLabel會覆蓋Image.

這個時候我們應(yīng)該怎么設(shè)置contentLabel的約束呢?

在contentLabel原來約束的基礎(chǔ)上,增加一個相對于Image的約束,距Image底部大于等于10像素,然后把距離titleLabel底部的距離設(shè)置為大于等于10像素,這樣Image和titleLabel誰的高度更高,contentLabel就距離高度較高的底部10個像素

contentLabel調(diào)整后的約束

以上就是在xib里需要做的事情

接下來是代碼里需要實現(xiàn)的東西:

在控制器中的 viewDidLoad的方法里只需要添加兩句代碼即可

- (void)viewDidLoad {
[super viewDidLoad];

// 設(shè)置數(shù)據(jù)源
_dataArray = @[@"設(shè)置的 AutoLayout 約束必須讓 cell 的 contentView 知道如何自動延展持痰。關(guān)鍵點是 contentView 的 4 個邊都要設(shè)置連接到內(nèi)容的約束,并且內(nèi)容是會動態(tài)改變尺寸的并且內(nèi)容是會動態(tài)改變尺寸的并且內(nèi)容是會動態(tài)改變尺寸的祟蚀。",@"設(shè)置連接到內(nèi)容的約",@"fjdsfds",@"要設(shè)置連接到內(nèi)容的約束工窍,并且內(nèi)容是會動態(tài)改變尺寸會動態(tài)改變尺會動態(tài)改變尺",@"sdfjslfff"].mutableCopy;
_titleArray = @[@"瘋狂的拉薩得思考",@"標(biāo)題的長度要長一點標(biāo)題的長度要長一點標(biāo)題的長度要長一點標(biāo)題的長度要長一點標(biāo)題的長度要長一點標(biāo)題的長度要長一點標(biāo)題的長度要長一點標(biāo)題的長度要長一點",@"sla接發(fā)的是",@"反倒是范德薩發(fā)范德薩發(fā)大廈范德薩發(fā)大廈范德薩范德薩發(fā)范德薩發(fā)大廈反倒是",@"粉絲發(fā)的是拉開富家大室"].mutableCopy;

// 告訴tableView的真實高度是自動計算的,根據(jù)你的約束來計算
self.tableView.rowHeight = UITableViewAutomaticDimension; 

// 設(shè)置cell的預(yù)估行高 ,作用:在tablView顯示時候,先根據(jù)估算高度得到整個tablView高,而不必知道每個cell的高度,從而達(dá)到高度方法的懶加載調(diào)用
self.tableView.estimatedRowHeight = 200; 

}

實現(xiàn)numberOfRowsInSection方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return 5;
}

將cellForRowAtIndexPath方法改為如下樣子

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *identifier = @"testcell";
    TestTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"TestTableViewCell" owner:self options:nil] lastObject];
    }
    [cell setNeedsUpdateConstraints];
    [cell updateConstraintsIfNeeded];
    cell.title.text = _titleArray[indexPath.row];
    cell.content.text = _dataArray[indexPath.row];
    
    return cell;

}

至此我們所有的工作就完成了,大家有沒有發(fā)現(xiàn),我們沒有一句代碼去實現(xiàn) heightForRowAtIndexPath 方法,但是最終的效果卻實現(xiàn)了cell高度的自適應(yīng)

下面就是最終的效果:

最終效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市前酿,隨后出現(xiàn)的幾起案子患雏,更是在濱河造成了極大的恐慌,老刑警劉巖罢维,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹仑,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機匀借,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門取试,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀吻,你說我怎么就攤上這事瞬浓。” “怎么了蓬坡?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵猿棉,是天一觀的道長。 經(jīng)常有香客問我屑咳,道長萨赁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任兆龙,我火速辦了婚禮杖爽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘紫皇。我一直安慰自己慰安,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布聪铺。 她就那樣靜靜地躺著化焕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃剔。 梳的紋絲不亂的頭發(fā)上撒桨,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音键兜,去河邊找鬼凤类。 笑死,一個胖子當(dāng)著我的面吹牛普气,可吹牛的內(nèi)容都是我干的谜疤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼棋电,長吁一口氣:“原來是場噩夢啊……” “哼茎截!你這毒婦竟也來了苇侵?” 一聲冷哼從身側(cè)響起赶盔,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榆浓,沒想到半個月后于未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年烘浦,在試婚紗的時候發(fā)現(xiàn)自己被綠了抖坪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡闷叉,死狀恐怖擦俐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情握侧,我是刑警寧澤蚯瞧,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站品擎,受9級特大地震影響埋合,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萄传,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一甚颂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秀菱,春花似錦振诬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梦碗,卻和暖如春禽绪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洪规。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工印屁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斩例。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓雄人,卻偏偏與公主長得像,于是被迫代替她去往敵國和親念赶。 傳聞我的和親對象是個殘疾皇子础钠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容