close
当前位置: 物联网在线 > 技术文库 > ios >

iOS那些“垃圾”的轮播

轮播视图通常也叫Banner,90%以上App都会用到的一个控件,网上有很多开源代码,但是至今我觉得比较好的一个是 SDCycleScrollView ,因为他解决了我接下来要吐槽的两个问题。

通常实现定时自动滚动Banner的思路大体有三种

1. 3个`UIImageView` 2. N+2个`UIImageView`思路 3. N * section(个人不推荐,因为这将代码写死了,当有个无聊的人真的滚动到最后一个section时,程序就会crash了)

前两种思路又分为用 UIScrollView 和 UICollectionView 实现, 个人没有用过第一种思路,都是第二种,本文也是基于第二种思路 ,这两种思路的中心思想其实都是运用了 视觉误差

快速滑动时卡顿

先来看看那些“垃圾”Banner

卡顿问题一(3个 UIImageView 思路)

iOS那些“垃圾”的轮播

Aiqiyi.gif

iOS那些“垃圾”的轮播

Youku.gif

通过卡顿频率,我猜想这两个项目的Banner思路应该一样,用的三个 UIImageView 。

不知道动图你是否看的卡顿的问题,如果你手机上恰好装了这两个App,可以自己试一下,很简单,只要快速滑动就可以了。

但是这两个的PageControl还是处理得很好的,能实时滚动到相应的位置。

卡顿问题二((N+2)个 UIImageView 思路)

iOS那些“垃圾”的轮播

Tianmao.gif

这个问题不好看出,因为他的卡顿频率比较低,刚好是一组轮播视图的周期。必须在第N+1张时才会复现。想看得清楚的小伙伴,如果自己项目Banner是这个思路可以测试一下自己项目的。

再看看这个PageControl的位置,在你快速滑动时,它是不动的,我猜想他控制PageControl的位置应该是在这个方法里做的

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { } 卡顿原因

就是这个两个方法其中一个里计算cell位置的判断条件不对

func scrollViewDidScroll(_ scrollView: UIScrollView) { } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { } Tab切换卡中间,不能复位

由于这个问题比较难复现,我就用自己的Demo测试的

UICollectionView实现,会自动修复

iOS那些“垃圾”的轮播

Test.gif

UIScrollView实现,需手动修复

iOS那些“垃圾”的轮播

HalfScreen.gif

动图中应该可以清楚的看到滚动视图滚动的坐标不对。

原因

这个具体原因我也不知道,这是所有轮播都会发生的问题,我猜想是跟内部的RunLoop应该有关。

还有的Banner是pageControl和cell联动不及时,比如 咸鱼

因为是在这里处理控制pageControl的位置的

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { }

简书Banner的pageControl向左手动拖动时又太灵敏。

func scrollViewDidScroll(_ scrollView: UIScrollView) { let page = scrollView.contentOffset.x / scrollView.frame.width if page <= 0.0 { // 向右拉 collectionView?.scrollToItem(at: IndexPath(item: urlStrs.count - 2, section: 0), at: .centeredHorizontally, animated: false) pageControl?.currentPage = urlStrs.count - 3 } else if page >= CGFloat(urlStrs.count - 1) { // 向左 pageControl?.currentPage = 0 collectionView?.scrollToItem(at: IndexPath(item: 1, section: 0), at: .centeredHorizontally, animated: false) } else { let value = page.truncatingRemainder(dividingBy: 1) < 0.5 if value { // cell过半才改变pageControl(简书的Banner应该没有这个判断) pageControl?.currentPage = Int(page) - 1 } } }

来自:


(责任编辑:ioter)

用户喜欢...

五个问题,闹明白低压差分信号隔离那些事

selina 在 周四, 12/14/2017 - 15:41 提交 对处于恶劣环境中的外部接口需要予以电流隔离,以增强安全性、功能性或是抗扰能力。这包括工业测量和控制所用数据采集模块当中的模拟前端,以及处理...


物联网如何解决垃圾管理问题

到2025年底,全球智能垃圾管理技术的市场价值预计将达到2.34亿美元。物联网革命为我们解决世界垃圾管理问题提供了...


炒作还是未卜先知?当年那些对于云计算的预测都实现了吗?

在最初的那批云计算热潮过去数年后,让我们不妨回望下当初的那些预言,曾经的炒作剩下的是黄金还是剩饭?...


小间距LED、MiniLED与MicroLED的那些事……

最近看到很多关于MiniLED、MicroLED的文章,有些说的很对,但是有些却被传的偏离轨道。关于被误导的原因,在线君特...


聪明垃圾桶 用物联网算出垃圾车最佳清运路线

城市如何运用物联网的发展,来提升垃圾清运的效率,是现在都市化发展的目标之一。目前智能垃圾清运技术正在丹...


如何打造智慧城市-3个智慧城市最佳入口,现在就可以实施

如何打造一座智慧城市看起来是一项非常艰巨的任务,毕竟面对的是整座城市。也许从小项目开始是一个不错的选择...


模拟技术中运放补偿电容的那些事儿...

运放的相位补偿 为了让运放能够正常工作,电路中常在输入与输出之间加一相位补偿电容。 1, 关于补偿电容 理论计算有是有的,但是到了设计成熟阶段好象大部分人都是凭借以前的调试经验...


那些设计iOS API需要知道的事

为了能够将我们项目中的代码能够在后续开发者使用(重用代码),通常使用的方法是将代码按照功能模块编写成API。那么我们就很有必要了解Objective-C语言中常见的编程范式(paradigm),同...


那些关于SaaS的利弊,你应该知道的事……

云端的服务有点像打包的软件,SaaS产品很容易使用,但是很难定制化。...


关于云计算牌照申请那些事儿 为何申请以及如何申请

近期资本市场对光环新网云计算的牌照(全称:互联网资源协作服务)很关注,我们预期牌照的发放相对确定,只是...