• 一种让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/(我很想吐槽目前苹果审核的效率。。。因此大家可以先体验一下安卓的版本)。

    目前我们已经做到了更为平滑的滚动,敬请等待我们的下一个版本,同时也敬请期待今后的博客,我会阐述如何这种情况下的平滑滚动。

  • 相关阅读:
    iOS开发 数据缓存-数据库
    我是程序猿,我自豪,我骄傲!嗷嗷嗷!
    【Golang】练习-复制文件
    【Golang】练习-读取目录下的文件并按时间进行排序
    【Golang】练习 tailf 简单模拟
    【Golang】基础-切片 for 循环删除元素
    【Golang】基础-操作 csv 文件
    【Golang】Godoc 或者第三方 plugins 插件介绍
    【Golang】类型转换之 cast 包
    【Golang】解决 go get下载包慢或者失败的问题
  • 原文地址:https://www.cnblogs.com/shanpow/p/4217059.html
Copyright © 2020-2023  润新知