寫在前面的話:
在iOS開發(fā)中,UITableview是我們用到的最多的控件,好多列表類的頁面都需要用表格的形式來寫,在開發(fā)的過程中,我們經(jīng)常會遇到列表中樣式基本一樣,但是會有不同顯示樣式的表,熟悉UITableview的都知道,這時候用UITableview是最合適的,但是每行cell的高度又不一樣,UITableview的代理方法中只有一個返回cell高度的方法,遇到這種情況的時候,我們需要怎么解決呢?今天我就教給大家一個最好的動態(tài)計算cell高度的方法。
UITableview的代理方法中有這樣一個方法:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
這個方法是返回每一行的cell也就是row的高度的代理方法,平時我們的寫法都是這樣的
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
這樣寫了以后我們的每一行cell的高度都是固定的100的高度,然而有時候我們并不是只要簡單的這樣的相同的高度,我們需要每一行的cell的高度都不一樣,那有人就會說, 我們直接判斷某一行是某一行,然后給返回不同的高度不就好了,像這樣:

當(dāng)然你寫出這樣的代碼,我真的不會說什么,如果cell只有5行的時候,你完全可以這樣寫,但是如果cell如果有500行,你也這樣寫么?那你不得寫死在這兒?那為了解決我們不死在鍵盤前,今天就進入我們的正式題目:
動態(tài)計算cell高度
動態(tài)計算cell高度
原理:原理其實很簡單,我們把cell里面每個控件的高度和cell的高度都用模型裝起來,然后讓模型動態(tài)自動計算每個控件的高度,并且動態(tài)得出cell的高度。這樣我們在上面的代理方法中就可以動態(tài)的獲取到cell的高度然后return回去了,空說難理解,直接上代碼

這里的XMCellFrame就是我創(chuàng)建的模型,里面裝的就是我的cell里面每個控件的frame,包括每個cell的高度,模型貼出來給你們看一下


細(xì)心的同學(xué)可能會發(fā)現(xiàn),我的.h 和.m文件有相同的屬性,兩者不同的是.h是加了只讀的readonly的,.m文件是沒有加readonly屬性的。這里給大家講解一下,為什么要這么寫呢,因為我這個模型里面只涉及到位置frame計算的,然后在引用的地方只是拿來用就行,不希望被別人改動的,所以我加了readonly屬性,在.m中因為你在外面加了readonly屬性,這里當(dāng)我們計算出位置以后需要給每個frame賦值,所以我們要重新聲明屬性才能給賦值,如果不重新聲明,會報錯。
計算frame的代碼如下:



注:在計算frame的模型中,我們有一個數(shù)據(jù)模型,通過重寫數(shù)據(jù)模型的set方法來計算每個控件的frame和cell的height。為什么要在model的set方法中這樣做呢,因為在計算frame的時候有時候是需要拿到數(shù)據(jù)去計算的,比如示例中的desFrame和photosFrame。
那么有人就會問了,那我的cell里面的各個控件的位置怎么賦值呢,別急,在下面

這里我已經(jīng)把基本的注意點和難點都寫出來了,也講明白了,如果你還是看不懂,我把demo給你們,你們下載來充分看一下,你學(xué)會這個方法,對你以后的開發(fā)絕對會有很大的作用,加油!