无限滚动列表和自动吸附

今天在做项目的时候,遇到一个问题,就是当数据量有成千上万行的时候,想要通过滚动列表实现的时候,不可能去实例化成千上万个Cell,这样对内存和效率都是暴击。那么唯一能做的就是把有限个Item在列表里不停的重复使用,来实现无限滚动。

NGUI下的滚动列表是用scrollview加grid或者table来实现的,在滑动列表的时候,grid是没有位移的,发生位移的是scrollview本身。grid底下的cell是按照CellWidth或者CellHeight来进行排序的。比如说我设置grid只有1列,cellHeight是100,那么第一个cell的位置是(0,0,0),第二个cell的位置就是(0,-100,0),第三个cell的位置是(0,-200,0),以此内推。垂直滚动的效果是通过scrollView沿Y轴移动来是实现的,grid作为scrollview的子节点,因此也跟着移动了,所以下边的cell会随着滚动出现在屏幕中间,同理,原来屏幕中间的cell就会滚动出屏幕。所以,无限滚动的原理就是当你使列表向上滑动时,把超出屏幕上边缘的cell移动到grid的最下方,当你使列表向下滑动时,把超出屏幕下边缘的cell,移动到grid的最上方,这样,就能用有限个Cell实现无限滑动啦。

另一个问题是scrollview的自动吸附问题,假设每一屏就显示一个cell,我们希望每一次滑动都能够将一个cell完整的显示在屏幕中,而不会使一个屏幕显示2个cell的各一半。这个基本就是个算法问题,NGUI的scrollview有onDragStarted和onDragFinished,我们在这2个委托中去分别记录下开始拖动屏幕的时间,位置结束拖动时的时间和位置,如果开始到结束的时间小于某个特定时间,比如0.5s,且手指位移超过固定值,比如50个像素,则我们认为是一次快速滑动,直接将scrollview按照滑动方向滚动到下一个cell的位置。如果不满足快速滑动的话,则将当前位置自动滑动到当前更靠近的cell的位置。

工程地址参见:https://github.com/yrsc/UnlimitedGrid

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,194评论 4 61
  • 风起沧澜阅读 669评论 0 2
  • “姥爷,今天我们去南湖吧!我带你跟姥姥玩。” “好的。” “哈哈哈,我太开心了,快来拍照,发给妈妈,姥姥,你是不...
    我爱画画写写画阅读 1,183评论 0 0
  • 1. 感恩让路的车子让我们平安抵达公司。 2. 感恩母亲时常发照片给我知道她生活点滴。 3. 感恩煮早餐午餐的档口...
    jaychua阅读 1,352评论 0 1
  • 将半熟的溏心蛋戳破涂抹在披萨表面,热乎乎的披萨与手工自酿的啤酒以及冰镇白葡萄酒超级搭! 制作时间:15分钟菜谱:没...
    我不是笑你吃阅读 4,930评论 0 1