? ? ? ? 怎么設(shè)置UITableViewCell高度比較合適?這個(gè)問(wèn)題對(duì)于初學(xué)者來(lái)說(shuō)有時(shí)會(huì)變成大問(wèn)題。大家都知道iOS的列表都是用UITableViewController來(lái)管理的,里面的每個(gè)單元格都是用UITableViewCell來(lái)定義(以下簡(jiǎn)稱為Cell),而且UITableViewController提供設(shè)置Cell高度的方法,就是要實(shí)現(xiàn)代理UITableViewDelegate,這個(gè)代理中有一個(gè)方法可以用來(lái)設(shè)置高度:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath)
? ? ? ? 但是這個(gè)方法設(shè)置Cell的高度有個(gè)很大的問(wèn)題:通過(guò)這個(gè)方法設(shè)置的Cell高度是死的,它不會(huì)根據(jù)Cell中的內(nèi)容變化而靈活的改變高度。例如,Cell中包含一段文字內(nèi)容并且文字的長(zhǎng)度不確定,也就是文字可能3行,也可能5行,明顯5行文字所要要求的高度要明顯大于3行,而固定高度的Cell肯定不能很好的適應(yīng)這種要求。
? ? ? ? 有什么辦法解決這個(gè)問(wèn)題呢?? 其實(shí)iOS早就為我們想好這種需求了,方法很簡(jiǎn)單:Cell中的視圖在高度方向要能形成明確的約束鏈。也就是說(shuō),Cell中所有的視圖設(shè)置約束后,Xcode能夠根據(jù)這些約束計(jì)算出一個(gè)確定的Cell高度。舉個(gè)簡(jiǎn)單的例子,如下圖所示:

? ? ? ? 這個(gè)Cell中包含一個(gè)UILabel視圖和一個(gè)UIButton視圖,那么怎樣才算有一個(gè)明確的約束鏈呢?可以像上圖那樣設(shè)置:UILabel上邊到Cell上邊的距離(100) + UILabel自身高度(25) + UIButton上邊到UILabel下邊的距離(102) + UIButton自身高度(25)+ UIButton下邊到Cell下邊的距離(105)。這樣整個(gè)Cell的高度就可以計(jì)算出來(lái):100+25+102+25+105=357。當(dāng)然,這個(gè)不需要我們?nèi)ニ?,我們只要做好這些約束,系統(tǒng)自動(dòng)會(huì)為我們計(jì)算出來(lái)。其實(shí),帶文字的視圖本身的高度我們不需要理會(huì),在這里為了說(shuō)明問(wèn)題,我們把文字高度設(shè)置為25,帶文字的視圖我們都不應(yīng)該設(shè)置固定高度,我們不理會(huì)就好了,因?yàn)槲淖謨?nèi)容以及字體大小等確定之后Xcode會(huì)自己計(jì)算視圖的高度。
? ? ? ? 當(dāng)然,設(shè)置約束的原則是讓Xcode知道Cell的總高度就好了,只要約束不沖突就可以了。因此,也可以像下圖這樣設(shè)置。只要UILabel視圖的下邊到Cell的下邊的距離足夠放下一個(gè)UIButton視圖就OK了,至于UIButton怎么約束已經(jīng)不重要了,因?yàn)檫@樣約束Xcode足以計(jì)算出整個(gè)Cell的高度了。

? ? ? ? 有問(wèn)題可以留言回復(fù)或者加我微信:1914532832,并備注:iOS開(kāi)發(fā)。