本教程適合新手.
- 系統:IOS7之后.
- 純文本高度.
血的教訓:
相信大家曾經為了實現cell的高度自適應,肯定少苦。那個時候,我是在我的數據模型model中添加一個height屬性,實現它的get方法,在get方法中計算需要多行顯示文字的高度,然后再加上其他亂七八糟的高度并返回,然后在tableview的 - (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath
中獲取到每行對應的model,取出其中的model.height屬性的值返回,還要在cell中確定cell中label的高度。。。總之就是很麻煩,而且還不一定總能算的很正確,甚是受此困擾。
柳暗花明:
我一直想,這種笨方法肯定有更簡單的方法取代,終于有一天我google一番之后發現了一個好方法.只要你懂一定的Autolayout知識的話,原來實現這種的cell高度自適應,其實是非常非常簡單的:
-
現在自定義的cell中將高度隨著內容動態改變的label的布局使用autolayout布局完成,這里有個注意點就是label和cell邊界的距離要確定好,不能固定死label的高度.
然后設置label的numberOfLines=0,行數設置為0即意味著label可以有任意行。
實現以下兩個tableview的delegate中的方法:
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
是的,只要實現這兩個方法,然后運行你的項目,你會驚訝的發現,哇塞,高度完美自適應…
這里有兩個關鍵點:
關鍵點1:必須重寫estimatedHeightForRowAtIndexPath
方法 這個方法是iOS7.0之后才出現的,如果不重寫此方法,僅重寫heightForRowAtIndexPath
,那么大家會發現,cell并不會根據label的內容,自適應高度。因為系統是先獲取cell的高度,再獲取cell的view。也就是先調用heightForRowAtIndexPath
,再調用cellForRowAtIndexPath
。
在cellForRowAtIndexPath
被調用之前,你的label是沒有被設置文本內容的,因此它獲取到的高度,并不是你想要的。那么我們必須想辦法讓系統在獲取了cell之后,再獲取cell的高度。方法就是,重寫estimatedHeightForRowAtIndexPath,顧名思義,它會返回一個估計高度,有了這個方法后,tableview會先調用它獲取估計高度,然后獲取cell,最后獲取真實高度。
estimatedHeightForRowAtIndexPath
的返回值可以隨意,返回多少都可以,只是給tableview一個安慰而已,讓它延遲獲取真實的高度。
關鍵點2:真實高度返回值為
UITableViewAutomaticDimension
Demo地址:https://github.com/yuying2012/WJDStudyLibrary
這是一個大工程,請從工程中尋找相關模塊代碼.