一种让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/(我很想吐槽目前苹果审核的效率。。。因此大家可以先体验一下安卓的版本)。
目前我们已经做到了更为平滑的滚动,敬请等待我们的下一个版本,同时也敬请期待今后的博客,我会阐述如何这种情况下的平滑滚动。
一种让UITableView的数据从下往上增长的方式的更多相关文章
- 四种常见的 POST-------- content-type数据提交方式
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...
- R You Ready?——大数据时代下优雅、卓越的统计分析及绘图环境
作者按:本文根据去年11月份CSDN举办的“大数据技术大会”演讲材料整理,最初发表于2012年2月期<程序员>杂志. 0 R 的安装
- 效果类似于label从下往上滑(采用uiTableView实现)
首先附上效果图 进行描述一下:效果就是类似于是一个竖直方向的滚动视图 并且方向是从下往上 并且能够一直这样循环下去. 代码“ // // ViewController.m // demo滚动视图上下 ...
- Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。
Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步. ogg要实现的功能: 同步可以细化到单个表,满足特定的where条件rows同步,称号column同步. ...
- iOS基础 - UITableView的数据源和代理
一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtI ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- mysql大数据量下的分页
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- EF3:Entity Framework三种开发模式实现数据访问
前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...
- (转载)Android之三种网络请求解析数据(最佳案例)
[置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报 分类: Gson.Gson解析(1) 版权声明:本文为博主原创 ...
随机推荐
- 全面理解面向对象的 JavaScript(转载)
http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/#resources 前言 当今 JavaScript 大行其道,各种应用对其依赖日 ...
- poj 2826(好坑,线段相交问题)
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11576 Accepted: 176 ...
- 微信支付报错:统一下单和拉起支付的appid不一致(原创)
微信支付报错:统一下单和拉起支付的appid不一致 错误码:-2 提示参考: 参考统一下单的API (谦信君原创,转载请注明来源) 原因排查: 我们做的是APP微信支付 客户端向我服务端发请求,获取预 ...
- 如何修改wamp目录【成功】
Wampserver安装好后,“www目录”默认为X:/wamp/www,(这里的X是盘符)也就是wampserver安装目录下的www文件夹.实际使用中,默认设置往往不是我们想要的,可能改成其他文件 ...
- HDU 2612 Find a way【多起点多终点BFS/两次BFS】
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- ZOJ 3380 Patchouli's Spell Cards
方案数,$dp$. 总的方案数有$n^m$种,符合要求的直接算不好算,可以算反面,即不符合要求的. 设$dp[i][j]$表示前$i$种等级填了$j$个位置,那么$dp[i][j]=sum(dp[i- ...
- floyed算法的一些感想
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) if(f[i][k]+f[k][j]<f[i ...
- Xamarin XAML语言教程控件模板的模板绑定
Xamarin XAML语言教程控件模板的模板绑定 控件模板的模板绑定 为了可以轻松更改控件模板中控件上的属性值,可以在控件模板中实现模板绑定功能.模板绑定允许控件模板中的控件将数据绑定到公共属性上. ...
- intellij idea android错误: Missing styles. Is the correct theme chosen for this layout?
Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou ...
- priority_queue的运算符重载问题
对于需要比较的函数或STL(最常见的为sort,priority_queue) 要对自创的结构进行运算符重载(sort可以写cmp,一样的效果) 1.只能对小于号重载 cmp函数与其起到相同的作用 2 ...