一種讓UITableView的數據從下往上增長的方式


遇到問題

一般來說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/(我很想吐槽目前蘋果審核的效率。。。因此大家可以先體驗一下安卓的版本)。

目前我們已經做到了更為平滑的滾動,敬請等待我們的下一個版本,同時也敬請期待今后的博客,我會闡述如何這種情況下的平滑滾動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM