遇到問題
一般來說tableview的數據都是從上往下增長,如下圖所示(先是aaa出現在表格列表的最頂部,然后bbb出現在aaa的下面,以此類推)
但是如果我們想反向這個過程該怎么做呢?如下圖所示(先是aaa出現在表格列表的最底部,然后aaa被頂上去,bbb出現在aaa原來的位置)
解決問題
我們當然第一時間向萬能的stackoverflow君求救,找到了這個解決方案。
原理很簡單就是讓整個tableview上下倒轉后再繪制在界面上,讓我們立即驗證一下吧,建一個簡單的Single View Application工程,然后在Storyboard的那個默認視圖上拖一個UITableView,然后做一些必要的設置能讓tableview能正常工作(這里就不再贅述了,相信大家沒任何問題)。
其中定義一個數組records
用於存放需要顯示的數據,其中數據如下
self.records = @[@"aaa",
@"bbb",
@"ccc",
@"ddd",
@"eee",
....
];
然后我們在-viewDidLoad:
中加入以下代碼
self.tableView.transform = CGAffineTransformMakeScale (1,-1);
趕緊運行一下看看
我們發現有兩個問題:第一,cell本身的內容是上下顛倒的;第二,bbb出現在了aaa的上面。讓我們一個一個地來解決這些問題。
解決cell內容上下顛倒問題
先解決第一個問題,其實非常簡單,由於是整個tableview的上下顛倒導致了cell內容的上下顛倒,那么要讓cell的內容看起來是正常的,只要讓cell的內容再次上下顛倒一下就行。我們就在 tableView:cellForRowAtIndexPath:
方法中加入以下代碼
cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
此時運行一下會發現cell的內容不再上下顛倒了。
解決數據順序不正確的問題
好了,接下來解決上面的第二個問題,我們希望aaa出現在bbb的上面該怎么做呢?其實也很簡單,只需要根據NSIndexPath
的值取正確的數據就行。
因為我們整個tableview是上下顛倒的,如果不做任何特殊處理,那么self.records
的第一個元素將永遠顯示在屏幕的最底部。就像在正常情況下,數據的第一個元素永遠顯示在屏幕的最上部一樣。所以解決方案也就呼之欲出,只要在顯示數據時候對數據的順序做一點小小的變更就行了。
當然這也有兩種方案,第一種在顯示新的數據時改變self.records
的內容,在位置0插入新的數據,這在數據是動態生成的時候可以一用,但是如果像我們在上面已經定義的一樣是固定的呢?我們就不得不再定義一個mutable的數組然后每次插入數據,此時這個方案就顯得繁瑣了。
第二種方法就是僅僅在顯示時修改每個數據的index映射方式就成。比如我們當前需要顯示三個元素:"aaa", "bbb"以及"ccc"。我們要確保aaa要顯示在bbb上面,而bbb顯示在ccc上面。那么 tableView:cellForRowAtIndexPath:
中可以做如下計算,當indexPath.Row
的值為0時,我們要取數據"ccc";當indexPath.Row
的值為1時,我們要取數據"bbb";當indexPath.Row
的值為2時,我們要取數據"ccc".
具體代碼如下(其中self.numberOfRecords
表示當前需要顯示多少數據)
NSInteger index = self.numberOfRecords - 1 - indexPath.row;
NSString *record = self.records[index];
最后再運行一下吧,此時就可以看到我們想要的效果。
總結
如果想看到這種需求到底會產生怎樣的效果,可以訪問我們的神劇http://www.shenjuapp.com/(我很想吐槽目前蘋果審核的效率。。。因此大家可以先體驗一下安卓的版本)。
目前我們已經做到了更為平滑的滾動,敬請等待我們的下一個版本,同時也敬請期待今后的博客,我會闡述如何這種情況下的平滑滾動。