UITableView控件是我們?nèi)粘i_發(fā)中經(jīng)常使用的控件之一,cell動態(tài)高度的計(jì)算也是老生常談的問題,我們一般計(jì)算高度的方法都是,cell中得各個(gè)控件的高度計(jì)算出來,然后給外界拋出一個(gè)接口,用來獲取cell高度,但是tableView返回高度的代理方法,總是頻繁的調(diào)用,我們還要注意不要在主線程使用過于復(fù)雜的算法以免阻塞主線程.
- 預(yù)加載
蘋果在iOS7之后給我們新增一個(gè)API
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);
下面我們先來了解一下tableView計(jì)算高度的機(jī)制.
tableView在渲染之前會不停的調(diào)用heightForRowAtIndexPath方法返回對應(yīng)cell高度,然后得到tableView的總高度,這意味在顯示tableView之前需要進(jìn)行大量的高度計(jì)算(這不是一屏,是計(jì)算所有數(shù)據(jù)的高度,并且是在主線程,很有可能會造成加載過慢,卡頓等現(xiàn)象)。有人問為什么不能等頁面滑動到某個(gè) cell 的時(shí)候,再計(jì)算高度呢?答案就是,tableView有一個(gè)小的ScrollIndicator滾動條,高度是用來確定滾動條的大小和位置的。
estimatedHeightForRowAtIndexPath這個(gè)方法的意思就是返回一個(gè)cell 高度的估計(jì)值,這樣tableView就直接取估值用來確定滾動條的信息而不需要調(diào)用多次算高的代理方法,這樣就可以大幅度提高tableView的加載速度。
需要注意的是:1.它是IOS7之后才有的API。2.如果你的業(yè)務(wù)需求需要你一開始使用到tableView的contentSize或者contentOffset,那么請慎用。
2.autoLayout自動算高
參考:https://my.oschina.net/hantianyu/blog/516244