寫在前面的話:
在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的高度都不一樣,那有人就會說曾撤, 我們直接判斷某一行是某一行盾戴,然后給返回不同的高度不就好了尖啡,像這樣:
當然你寫出這樣的代碼衅斩,我真的不會說什么怠褐,如果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的高度页眯,模型貼出來給你們看一下
細心的同學可能會發(fā)現(xiàn)餐茵,我的.h 和.m文件有相同的屬性锣笨,兩者不同的是.h是加了只讀的readonly的,.m文件是沒有加readonly屬性的椭岩。這里給大家講解一下,為什么要這么寫呢塌计,因為我這個模型里面只涉及到位置frame計算的,然后在引用的地方只是拿來用就行,不希望被別人改動的伊脓,所以我加了readonly屬性,在.m中因為你在外面加了readonly屬性榄笙,這里當我們計算出位置以后需要給每個frame賦值,所以我們要重新聲明屬性才能給賦值,如果不重新聲明拄查,會報錯。
計算frame的代碼如下:
注:在計算frame的模型中,我們有一個數(shù)據(jù)模型科平,通過重寫數(shù)據(jù)模型的set方法來計算每個控件的frame和cell的height污抬。為什么要在model的set方法中這樣做呢矢腻,因為在計算frame的時候有時候是需要拿到數(shù)據(jù)去計算的多柑,比如示例中的desFrame和photosFrame聂沙。
那么有人就會問了,那我的cell里面的各個控件的位置怎么賦值呢,別急温眉,在下面
這里我已經(jīng)把基本的注意點和難點都寫出來了豌骏,也講明白了,如果你還是看不懂,我把demo給你們洒琢,你們下載來充分看一下荧嵌,你學會這個方法谭网,對你以后的開發(fā)絕對會有很大的作用,加油锥涕!