https://www.cnblogs.com/shanpow/p/4217059.html
一般來說tableview的數(shù)據(jù)都是從上往下增長,如下圖所示(先是aaa出現(xiàn)在表格列表的最頂部,然后bbb出現(xiàn)在aaa的下面残邀,以此類推)
但是如果我們想反向這個過程該怎么做呢?如下圖所示(先是aaa出現(xiàn)在表格列表的最底部,然后aaa被頂上去,bbb出現(xiàn)在aaa原來的位置)
解決問題
我們當然第一時間向萬能的stackoverflow君求救竹勉,找到了這個解決方案。
原理很簡單就是讓整個tableview上下倒轉后再繪制在界面上娄琉,讓我們立即驗證一下吧次乓,建一個簡單的Single View Application工程,然后在Storyboard的那個默認視圖上拖一個UITableView孽水,然后做一些必要的設置能讓tableview能正常工作(這里就不再贅述了票腰,相信大家沒任何問題)。
其中定義一個數(shù)組records
用于存放需要顯示的數(shù)據(jù)匈棘,其中數(shù)據(jù)如下
self.records = @[@"aaa",
@"bbb",
@"ccc",
@"ddd",
@"eee",
....
];
然后我們在-viewDidLoad:中加入以下代碼
self.tableView.transform = CGAffineTransformMakeScale (1,-1);
我們發(fā)現(xiàn)有兩個問題:第一,cell本身的內容是上下顛倒的析命;第二主卫,bbb出現(xiàn)在了aaa的上面。讓我們一個一個地來解決這些問題鹃愤。
解決cell內容上下顛倒問題
先解決第一個問題簇搅,其實非常簡單,由于是整個tableview的上下顛倒導致了cell內容的上下顛倒软吐,那么要讓cell的內容看起來是正常的瘩将,只要讓cell的內容再次上下顛倒一下就行。我們就在tableView:cellForRowAtIndexPath:方法中加入以下代碼
cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
此時運行一下會發(fā)現(xiàn)cell的內容不再上下顛倒了凹耙。
解決數(shù)據(jù)順序不正確的問題
好了姿现,接下來解決上面的第二個問題,我們希望aaa出現(xiàn)在bbb的上面該怎么做呢肖抱?其實也很簡單备典,只需要根據(jù)NSIndexPath
的值取正確的數(shù)據(jù)就行。
因為我們整個tableview是上下顛倒的意述,如果不做任何特殊處理提佣,那么self.records
的第一個元素將永遠顯示在屏幕的最底部。就像在正常情況下荤崇,數(shù)據(jù)的第一個元素永遠顯示在屏幕的最上部一樣拌屏。所以解決方案也就呼之欲出,只要在顯示數(shù)據(jù)時候對數(shù)據(jù)的順序做一點小小的變更就行了术荤。
當然這也有兩種方案倚喂,第一種在顯示新的數(shù)據(jù)時改變self.records
的內容,在位置0插入新的數(shù)據(jù)瓣戚,這在數(shù)據(jù)是動態(tài)生成的時候可以一用务唐,但是如果像我們在上面已經定義的一樣是固定的呢雳攘?我們就不得不再定義一個mutable的數(shù)組然后每次插入數(shù)據(jù),此時這個方案就顯得繁瑣了枫笛。
第二種方法就是僅僅在顯示時修改每個數(shù)據(jù)的index映射方式就成吨灭。比如我們當前需要顯示三個元素:"aaa", "bbb"以及"ccc"。我們要確保aaa要顯示在bbb上面刑巧,而bbb顯示在ccc上面喧兄。那么tableView:cellForRowAtIndexPath:
中可以做如下計算,當indexPath.Row
的值為0時啊楚,我們要取數(shù)據(jù)"ccc"吠冤;當indexPath.Row
的值為1時,我們要取數(shù)據(jù)"bbb"恭理;當indexPath.Row
的值為2時拯辙,我們要取數(shù)據(jù)"ccc".
具體代碼如下(其中self.numberOfRecords
表示當前需要顯示多少數(shù)據(jù))
NSInteger index = self.numberOfRecords - 1 - indexPath.row;
NSString *record = self.records[index];
最后再運行一下吧,此時就可以看到我們想要的效果颜价。
總結
如果想看到這種需求到底會產生怎樣的效果涯保,可以訪問我們的神劇http://www.shenjuapp.com/(我很想吐槽目前蘋果審核的效率。周伦。夕春。因此大家可以先體驗一下安卓的版本)。
目前我們已經做到了更為平滑的滾動专挪,敬請等待我們的下一個版本及志,同時也敬請期待今后的博客,我會闡述如何這種情況下的平滑滾動寨腔。