遇到问题

一般来说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的数据从下往上增长的方式的更多相关文章

  1. 四种常见的 POST-------- content-type数据提交方式

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  2. R You Ready?——大数据时代下优雅、卓越的统计分析及绘图环境

    作者按:本文根据去年11月份CSDN举办的“大数据技术大会”演讲材料整理,最初发表于2012年2月期<程序员>杂志. 0  R 的安装

  3. 效果类似于label从下往上滑(采用uiTableView实现)

    首先附上效果图 进行描述一下:效果就是类似于是一个竖直方向的滚动视图 并且方向是从下往上  并且能够一直这样循环下去. 代码“ // // ViewController.m // demo滚动视图上下 ...

  4. Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。

    Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步. ogg要实现的功能: 同步可以细化到单个表,满足特定的where条件rows同步,称号column同步. ...

  5. iOS基础 - UITableView的数据源和代理

    一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtI ...

  6. 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 ...

  7. mysql大数据量下的分页

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  8. EF3:Entity Framework三种开发模式实现数据访问

    前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...

  9. (转载)Android之三种网络请求解析数据(最佳案例)

    [置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报  分类: Gson.Gson解析(1)  版权声明:本文为博主原创 ...

随机推荐

  1. libssh2

    http://www.cnblogs.com/lzrabbit/p/4298794.html shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh ...

  2. npm编译报错,缺少组件

    解决方式: 1.删除安装文件 node_modules: 2.在需要安装 node_modules 文件的文件夹中,打开命令窗口,输入: cnpm install: 3.再输入: npm start, ...

  3. ReadOnly与Enabled

    txtDlrCode.ReadOnly = true; 1.当设置为只读,文本框有点击事件,点击该文本框还是可以响应点击事件 2.设置为只读,C#后台无法取得文本框的值,txtDlrCode.Text ...

  4. 区块链开发(六)truffle使用入门和testrpc安装

    在上篇博文中我们已经成功安装了truffle及所需相关环境,此篇就简单介绍一些truffle的使用及目录结构等. 简介truffle和testrpc truffle是本地的用来编译.部署智能合约的工具 ...

  5. Centos7源码编译安装tengine1.5.1

    安装依赖包 yum install pcre pcre-devel openssl openssl-devel gcc make zlib-devel wget -y 下载和创建用户 mkdir /t ...

  6. 【互动问答分享】第8期决胜云计算大数据时代Spark亚太研究院公益大讲堂

    “决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第8期互动问答分享] Q1:spark线上用什么版本好? 建议从最低使用的Spark 1.0.0版本,Spark在1.0.0开始核心 ...

  7. D - Interesting Calculator 【数值型BFS+优先队列】

    There is an interesting calculator. It has 3 rows of buttons. Row 1: button 0, 1, 2, 3, ..., 9. Pres ...

  8. JavaScript处理异步请求的几种方式(取异步函数返回值)

    JavaScript处理异步的几种方式 Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个 ...

  9. ant脚本调用.bat文件

    build.xml内容如下: <project name="example" default="test"> <target name=&qu ...

  10. 最小割分治(最小割树):BZOJ2229 && BZOJ4519

    定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...