Leader非常中意这个特效,说要在我们app中使用,问我能不能实现,我一看这个特效,卧槽,涉及了好多技术点,实现难度很大。如果是自己做特效还好,模仿别人的特效,做的粗糙没什么,如果要做得好,就得考虑好多细节。身为男人,怎么能说不行,自己给自己安排时间,偷偷搞,经过了几天的艰苦奋战,终于完成了,开森。

能够完成这个特效,感谢她,感谢他,感谢一如既往支持我的人。

进入正题

先看下新浪的特效(版本 v6.6.0)

先分析一下这个滚动特效,有3种方式控制滚动:

1、1个是手指上下滑动整个表格,中间的滚动视图会跟着一起动。

2、1个是左右滑动中间的滚动视图,滚动视图会快速滑动。

3、1个是左右晃动手机,根据角度不同,滚动视图跟着一起动。

需要解决很多问题:

1、中间的滚动视图是一块一块移动的,停止时距离中间最近的卡片会自动滑动到中间,居中对齐。

2、中间的滚动视图在滑动的时候发现卡片是叠在一起的,中间的在上层,其他部分在下层,根据距离中间位置的远近来区别上下层。

3、中间的滚动视图在滑动的时候发现卡片大小不一致,中间的最大,越靠近边框越小。

4、中间的滚动视图在滑动的时候发现滑动的距离和卡片移动的距离并不是成正比,而是按照不断变化的加速度移动的。

5、中间的滚动视图滑到左右边缘时视图透明度改变。

6、循环滚动方案的实现

7、上下滑动表格时,中间的滚动视图要跟着一起滑动,上滑时向左移动,下滑时向右移动。

8、左右晃动手机时,中间的滚动视图要跟着一起滑动,向左晃动时卡片向左移动,向右晃动时卡片向右移动。

9、需要保证刚才提到的3种控制方式互不干扰。

大问题大概就是这几个,当然还有很多小问题,就不一一列出来了。

那么,说干就干

完成这个特效之前,首先是要选择实现工具,实现工具的选择很重要,相当于方向,方向选对了,才能使上大力气。

实现工具有3种:

1、自定义滚动视图

2、UIScrollView

3、UICollectionView

第一种,使用自定义滚动视图,亲自去Github上面找了不少关于自定义滚动视图的demo,觉得难度不是一般的难,而是二班的难呐,想着新浪的iOS开发水平应该也没那么强,肯定不是这种方案,就Pass了第一种。

那么看下第二种,使用UIScrollView,苹果自己弄的UIScrollView,可以分页是可以分页,但是只能整个视图分页,无法做到区域分页,看了不少的Demo,实现效果也差强人意,无奈Pass了第二种。

那么第三种呢?使用UICollectionView,在网上找到了不少可以提供灵感的Demo,感觉上是可行的,然后伟哥给了类似的Demo告诉我这种方案的可行性。可以的,那就用这种方式搞起。

确定好了方向之后就全力以赴了。

问题1:中间的滚动视图是一块一块移动的,停止时距离中间最近的卡片会自动滑动到中间,居中对齐。

UICollectionView有个布局类叫做UICollectionViewFlowLayout,可以在里面实现卡片效果,通过计算每个可见Cell到中间位置,来计算出偏移量,得出CollectionView最终停留的位置,实现自动滑动到中间,居中对齐的效果。实现以下方法:

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity

问题2:中间的滚动视图在滑动的时候发现卡片是叠在一起的,中间的在上层,其他部分在下层,根据距离中间位置的远近来区别上下层。

看UICollectionViewFlowLayout布局文件,通过计算可见Cell到中心点位置,来确定Cell的位置,达到叠加的效果。上下层的概念则是通过z轴的不同来实现,搞过游戏的朋友可能会更清楚一些,三维坐标系中有x轴,y轴,z轴,通过z轴确定视图的上下层次。实现以下方法:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds

问题3:中间的滚动视图在滑动的时候发现卡片大小不一致,中间的最大,越靠近边框越小。

在UICollectionViewFlowLayout布局文件中解决,设置好垂直缩放系数,根据距离的远近进行放大处理,距离中间的放到最大。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

问题4:中间的滚动视图在滑动的时候发现滑动的距离和卡片移动的距离并不是成正比,而是按照不断变化的加速度移动的。

在UICollectionViewFlowLayout布局文件中解决,根据可见Cell到中心的不同位置

设置移动距离,不同的距离使用不同的加速度。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

问题5:中间的滚动视图滑到左右边缘时视图透明度改变。

在UICollectionViewFlowLayout布局文件中解决,通过计算边缘距离,来动态改变透明度。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

问题6:循环滚动方案的实现

关于循环滚动方案,网上的说法层出不穷。我以前也搞过循环滚动,中间呈现3个,使用5个视图进行循环滚动。但这种方案计算比较复杂,功力不够的小伙伴还是不要尝试的好。还有一种方案是可以让它滚动到最后一格的时候,跳转到第一格,这种方案有点不是很流畅。最终我采用了中间定位法实现了循环滚动,需要使用下面的方法:

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];

问题7:上下滑动表格时,中间的滚动视图要跟着一起滑动,上滑时向左移动,下滑时向右移动。

需要在表格类中滚动代理方法里面设置滚动时设置UICollectionView的ContentOffset偏移量,然后在scrollViewDidEndDragging和scrollViewDidEndDecelerating两个方法中设置滚动结束后,UICollectionView的ContentOffset偏移量,需要计算到屏幕中间位置的偏移量进行偏移。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

问题8:左右晃动手机时,中间的滚动视图要跟着一起滑动,向左晃动时卡片向左移动,向右晃动时卡片向右移动。

晃动手机,涉及到硬件支持。iPhone手机内配置了各种传感器,其中一个就是重力感应。通过了解重力感应,知道了加速器,使用加速器来控制晃动偏移量,发现效果不好,抖动特别厉害,在网上也没有特别好的例子说明。那么改用陀螺仪,苹果的陀螺仪做的非常精致,效果也很好,非常稳定,但是又发现了新问题,就是运动停止不了。最终在加速器和陀螺仪的配合之下,终于完美的解决了问题。

- (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler

- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler

问题9:需要保证刚才提到的3种控制方式互不干扰。

涉及到条件判断,不仅需要在表格的UIScrollView代理方法做控制,还要在UICollection代理方法做控制,保证效果互不干扰。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

如果是按照新浪新闻的还简单一点,但是问题是,我们的产品总是会搞点花样,比如修改透明度,修改圆角呀,等等,所以实现的难度就增加了不少。总之,兵来将挡水来土掩,完成就是了。

尾记:有人说服务端比客户端强,并非如此。闻道有先后,术业有专攻,不同的人,Level也不同。做接口考虑大数据,考虑数据库结构,查询优化等等,这些说白了无非还是工具、数学、逻辑思维、数据结构、算法,跟客户端差不多。客户端也要考虑代码框架设计、网络框架设计、数据库设计、特效空间数学计算、逻辑处理、数据结构、算法等等。客户端做的强的人,转到服务端也是分分钟搞定的事。

君凯商联网-iOS-字唐名僧

iOS 新浪新闻首页卡片滚动特效实现相关推荐

  1. python3爬虫-爬取新浪新闻首页所有新闻标题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/xiangwanpeng/articl ...

  2. python爬取新浪新闻首页_Python爬虫学习:微信、知乎、新浪等主流网站的模拟登陆爬取方法...

    微信.知乎.新浪等主流网站的模拟登陆爬取方法 摘要:微信.知乎.新浪等主流网站的模拟登陆爬取方法. 网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样.从是否需要登陆这方面来说,一些 ...

  3. python爬取新浪新闻首页_学习了《python网络爬虫实战》第一个爬虫,爬取新浪新闻...

    请安装anaconda,其中附带的spyder方便运行完查看变量 1.进入cmd控制台, 输入 pip install BeautifulSoup4 pip install requests 2.编写 ...

  4. requests, Beautifusoup 爬取新浪新闻资讯

    ###1.爬取新浪新闻首页的新闻标题时间和链接 1 import requests 2 from bs4 import BeautifulSoup 3 4 res = requests.get('ht ...

  5. 网络爬虫-----python爬取新浪新闻

    思路:先爬取首页,然后通过正则筛选出所有文章url,然后通过循环分别爬取这些url到本地 #python新闻爬虫实战 import urllib.request import re url = 'ht ...

  6. 【python】【爬虫】Scrapy Crawl自动爬虫【获取新浪新闻为例】

    Scrapy自动爬虫(crawl模板)[scrapy genspider -t crawl news news.sina.com.cn] Crawl自动爬虫适用: 对有规律的网站进行自动爬取 Craw ...

  7. 新浪新闻简单抓取备忘录

    一,抓取新浪新闻的简单方法 1.requests        2.pyquery解析        3.自定义日志类logger.py 代码中分别使用了python多进程multiprocessin ...

  8. (python爬虫)新浪新闻数据爬取与清洗+新浪新闻数据管理系统+MySQL

    新浪新闻数据爬取与清洗+新浪新闻数据管理系统 设计要求 新浪新闻数据爬取与清洗 基本要求:完成新浪新闻排行中文章的数据爬取,包括标题.媒体.时间.内容. 进阶要求:对最近一周出现次数最多的关键字排名并 ...

  9. 新浪新闻改版了,是到了告别的时候了吗?

    上午11点,想和同事讨论某页面改版,记得新浪新闻有类似内容的处理,就顺手打开给她看--大约8年多了,"新浪新闻"一直都放在我的收藏夹里,无论是IE.火狐.傲游,从未改变. 然而打开 ...

  10. 模拟新浪新闻在线聊天功能

    前几天看到新浪新闻出现了一个新东西:看同一条新闻的人可以在页面上的一个聊天块中进行聊天. 聊天的程序功能不是什么新鲜事,不过新浪的这个看同一条新闻的人聊天的这个还蛮有意思. 关键的地方就是根据不同的新 ...

最新文章

  1. “汇新杯”新兴科技+互联网创新大赛青年创客专项赛即将截止报名
  2. 【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )
  3. AppLaunchScreen/Screenshot(启动图/屏幕快照)输出规范
  4. 前端学习(1603):脚手架组件使用
  5. 8.深度学习练习:Gradient Checking
  6. linux 判断网卡是否异常_如何判断linux网卡故障?
  7. apscheduler 脚本执行失败_在脚本中使用 Bash 信号捕获 | Linux 中国
  8. Android 获取静态上下文(Application)
  9. MySQL日志设置双1_mysql日志配置文件示例
  10. python 运算符与流程控制
  11. php简单实现二级联动
  12. shell十三问-3) 別人 echo、你也 echo ,是问 echo 知多少
  13. 【机器学习】二次规划
  14. 小黑笔记:transe模型
  15. python panda 库箱线图_Python Pandas 箱线图的实现
  16. IDC BGP 选型、出海线路
  17. 一套近乎完美的公司财务流程
  18. Dronekit 搭配使用Ardupilot 和 PX4
  19. 《玩不够的数学:算术与几何的妙趣》:第一章 平面上的几何艺术
  20. 关于Adobe PDF 0day的故事

热门文章

  1. 谷歌浏览器好用的插件
  2. Latex 操作(3) beamer(PPT)
  3. OPPO小布4.0:软件定义硬件,智能定义“助手”
  4. Java实现合成图片
  5. [PTA] 7-6 厘米换算英尺英寸
  6. 局域网使用NAT进行测试第三方接口
  7. 王强是如何学计算机的,浙江大学计算机科学与技术学院导师介绍:王强
  8. 流氓与骗子的斗嘴(转)
  9. 淘宝原数据商品详情API调用示例
  10. 微信小程序地图图标controltap