项目中总有写比较变态的需求,我们的UI设计师有喜欢很酷的交互,其中有个需求类似这种的

右侧部分是可以滚动的当然是无限滚动,这中效果只有UICollectionView的自定义布局才能实现,重写Layout的几个方法主要的代码就是给UICollectionViewLayoutAttributes的属性赋值,主要是为这几个center,size, transform3D;属性赋值,主要使用的是AWCollectionViewDialLayout这个三方的布局。

但是,这个三方并没有实现无限滚动的。无限滚动也可以在scrollViewDidScroll:方法中进行检测,开头和结尾地方多添加几个元素,如果到最后一个了重新回到第一个,但是这种实现有很强的卡顿感,所以后来放弃了这个。后来,在github找到了一种办法,自定义拖拽手势UIPanGestureRecognizer

,然后再拖拽手势的target,action方法中进行判断如果状态来更改UICollectionView的偏移量,代码如下

- (void)customPan:(UIPanGestureRecognizer *)sender {if (sender.state == UIGestureRecognizerStateBegan) {self.oldOffset = self.collectionView.contentOffset;}if (sender.state == UIGestureRecognizerStateChanged) {CGPoint translation = [sender translationInView:self.collectionView];CGPoint offset;offset.y = (self.oldOffset.y - translation.y);if (fabsf(translation.y)>30) {[self.collectionView setContentOffset:offset animated:NO];}}if (sender.state == UIGestureRecognizerStateEnded) {CGPoint translation = [sender translationInView:self.collectionView];self.previousCell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:self.centerItem inSection:0]];NSInteger step = 1;step = abs(translation.y/item_height)+1;//计算需要走几步if (translation.y > 0) {向上滑动if (translation.y > (item_height/2+10)) {if ((0 < self.centerItem) && (self.centerItem <= (self.count - step))) {self.centerItem -= step;}}} else if (translation.y < 0){//向下滑动if (abs(translation.y)>(item_height/2+10)) {if ((0 <= self.centerItem) && (self.centerItem < self.count - step)) {self.centerItem += step;}}}[self.collectionView setContentOffset:CGPointMake(0, self.centerItem*item_height) animated:YES];}}

然后再滚动视图的scrollViewDidEndScrollingAnimation:的代理方法中来判断视图的偏移量如果到首部或者尾部就重新设置UICollectionView的偏移量,这样没有丝毫的卡顿感了,但是却有个很大的缺陷,自定义的手势没有是减速的,最多有个滚动结束时的动画。

UICollectionView的无限滚动的方法我找了很长时间一直没有找到很理想的方法,所以这种只能算是个妥协的方法。

转载于:https://blog.51cto.com/yunsankai/1613904

UICollectionView的无限滚动---妥协做法相关推荐

  1. UICollectionView实现无限滚动(理解花了我不少时间)

    第一步: // 程序一开始就滚动到第二个cell // 滚动的前提是已经有cell数据了(所以不要在数据还没有加载就滚动) NSIndexPath *idxPath = [NSIndexPath in ...

  2. Swift 4 无限滚动轮播图(UICollectionView实现)

    作为一个资深(自认为)iOS程序猿,会经常用到轮播图,但是总是感觉自己实现要比直接用别人的要方便一点,并且有一些需求需要深度定制,于是想着自己封装一个可以定制化的轮播图库JCyclePictureVi ...

  3. 分页与无限滚动在评论区的设计差异

    本文由作者 呆呆丶 于社区发布 本篇文章的问题挺有意思,虽然是一个页面中无关紧要的模式,但却是典型的反模式设计,各位可以简单读读. 读者提问: 社区论坛类产品,天涯.虎扑与百度贴吧的帖子评论页有一个设 ...

  4. html滚动条自动翻页,10款无限滚动自动翻页jquery插件

    无限滚动自动翻页可以说是web2.0时代的一项堪称伟大的技术,它让我们在浏览页面的时候只需要把滚动条拉到网页底部就能自动显示下一页的结果,改变了一直以来只能通过点击下一页来翻页这种常规做法.无限滚动自 ...

  5. 使用RecycleView实现无限滚动的日历

    最终效果 项目地址 一.无限滚动实现 在RecyclerView.Adapter的getItemCount()方法中返回Integer.MAX_VALUE,使用RecycleView的scrollTo ...

  6. vue2.0无限滚动加载数据插件

      做vue项目用到下拉滚动加载数据功能,由于选的UI库(element)没有这个组件,就用Vue-infinite-loading 这个插件代替,使用中遇到的一些问题及使用方法,总结作记录! 安装: ...

  7. 15个非常棒的jQuery无限滚动插件【瀑布流效果】

    现在,最热门的网站分页趋势之一是jQuery的无限滚动(也即瀑布流).如果你碰巧观察Pinterest的网站,如Facebook,Twitter和deviantART的,你会发现无限滚动的动作,当旧的 ...

  8. 响应式的无限滚动全屏dribbble作品集布局展示效果

    来源:GBin1.com 在线演示/下载 大家还记得前面分享过的两个魔术布局效果吧: 响应式的dribbble作品集魔术布局展示效果 宽度自适应缩进的响应式dribbble作品集魔术布局展示效果 今天 ...

  9. 051_InfiniteScroll无限滚动

    1. InfiniteScroll无限滚动 1.1. InfiniteScroll无限滚动滚动至底部时, 加载更多数据. 1.2. Attributes 参数 说明 类型 默认值 infinite-s ...

最新文章

  1. 小米和西工大联手,三篇论文被Interspeech接收
  2. 网络工程师计算机类吗,机房网络工程师 | 网络工程专业的你知道吗?
  3. ABAP 用户选择屏幕 搜索帮助 实现代码
  4. 【Go】Panic函数
  5. mysql哪一款好用_用了这么多年MySql,这些好习惯你用过哪些
  6. java intent 传递集合对象_Android系列之Intent传递对象的几种实例方法
  7. PHP7内核基础知识之变量类型
  8. unknown host www.baidu.com 解决方法
  9. springboot整合aliyun的物流订单查询
  10. 一次搞懂清晰度、对比度以及锐化的区别
  11. 对接第三方支付接口-支付宝方式对接(我这边对接的是ecpay公司支付接口)
  12. 谈谈Mysql 字符串连接 CONCAT CONCAT_WS GROUP_CONCAT区别及使用场景
  13. 时序分析基本概念介绍--Timing Arc
  14. 信息化,不只是技术-某公司局域网改造实例(转)
  15. EI 收录的期刊有哪些
  16. c语言中val是什么函数,val(val是什么意思)
  17. 微信可以改彩色昵称了!!!太sao了吧!
  18. requests+pytest+allure接口测试框架搭建
  19. Swing中EDT和SwingUtilities以及SwingWorker的简单深入
  20. 读书笔记--PRML(1)

热门文章

  1. 将PDF Expert设置为默认打开程序的操作步骤
  2. Notepad++免费开源文本编辑器
  3. 分布式 Socket 通信
  4. Matlab设置Legend横排、分块
  5. yii2-按需加载并管理CSS样式/JS脚本
  6. 使用PowerShell收集客户端MAC地址
  7. js 缺少标识符、字符串或数字
  8. AVPlayer支持VSFilter啦, 也就支持字幕啦
  9. 使用.NET,郁闷之余,写下的废话
  10. C++ 字符串中小写字母转换成大写字母