通常來講tableview的數據都是從上往下增加,以下圖所示(先是aaa出如今表格列表的最頂部,而後bbb出如今aaa的下面,以此類推)數組
可是若是咱們想反向這個過程該怎麼作呢?以下圖所示(先是aaa出如今表格列表的最底部,而後aaa被頂上去,bbb出如今aaa原來的位置)app
咱們固然第一時間向萬能的stackoverflow君求救,找到了這個解決方案。code
原理很簡單就是讓整個tableview上下倒轉後再繪製在界面上,讓咱們當即驗證一下吧,建一個簡單的Single View Application工程,而後在Storyboard的那個默認視圖上拖一個UITableView,而後作一些必要的設置能讓tableview能正常工做(這裏就再也不贅述了,相信你們沒任何問題)。orm
其中定義一個數組records
用於存放須要顯示的數據,其中數據以下blog
self.records = @[@"aaa", @"bbb", @"ccc", @"ddd", @"eee", .... ];
而後咱們在-viewDidLoad:
中加入如下代碼get
self.tableView.transform = CGAffineTransformMakeScale (1,-1);
趕忙運行一下看看博客
咱們發現有兩個問題:第一,cell自己的內容是上下顛倒的;第二,bbb出如今了aaa的上面。讓咱們一個一個地來解決這些問題。io
先解決第一個問題,其實很是簡單,因爲是整個tableview的上下顛倒致使了cell內容的上下顛倒,那麼要讓cell的內容看起來是正常的,只要讓cell的內容再次上下顛倒一下就行。咱們就在tableView:cellForRowAtIndexPath:
方法中加入如下代碼table
cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
此時運行一下會發現cell的內容再也不上下顛倒了。form
好了,接下來解決上面的第二個問題,咱們但願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/(我很想吐槽目前蘋果審覈的效率。。。所以你們能夠先體驗一下安卓的版本)。
目前咱們已經作到了更爲平滑的滾動,敬請等待咱們的下一個版本,同時也敬請期待從此的博客,我會闡述如何這種狀況下的平滑滾動。