技术其他swiftiOS学习包

swift:无限图片轮播器

2015-11-15  本文已影响5797人  疯狂的剁椒鱼头

swift:无限图片轮播器

图片轮播器用处很广,什么广告投放呀,新闻头条滚动之类的,都是使用它。出于学习的目的用swift基于UICollectionView开发了一个无限循环的图片轮播器。附上Github源码以及素材地址CyclePictureView。下面是演示


适合人群

用swift写了一个无限图片轮播器,适合初学者。为了方便大家一步步自己开发,已经把开发过程中的每一个阶段都用了一个工程,当然你也可以使用git回滚。而且在功能基本完成后,花了很大的心思对代码进行重构,让代码更加符合swift的编程模式。

编码

1.完成本地图片的显示

这一阶段十分简单,大家参照源码1.完成本地图片的显示工程应该不会有问题

2.完成网络图片的显示

这一阶段如果是有经验的开发者就对我实现这两种图片加载的方式感到不爽了,因为这里是可以对代码进行重构的。当然,对于初学者的我们,一定要以实现功能为主如果在项目一开始就考虑代码这样写不好,那样写不好。那么你永远可能也迈不出项目第一步,会严重拖缓开发进度。所以我们先实现功能,对于代码的重构,一个阶段一个阶段的来,或者说你啥时候实在忍不了了,那就整理代码吧。

3.完成文字显示,并暴露一些接口

这里需要注意一点,父控件对于子控件的布局操作最好是放在layoutSubviews,因为只有在layoutSubviews这个方式里面才能保证子控件在你希望的地方显示。这个方法在控件最终显示前会调用一次进行最后的布局,当然也不仅仅是这时候才调用,附上layoutSubviews调用时机.

1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 

举个例子,就拿本项目来说,CyclePictureCell的子控件有用于显示图片的imageVIew和用于显示文字的UILabel,那么我对这两个控件的大小以及位置的设置,最好放在CyclePictureCelllayoutSubviews方法。ps:layoutSubviews一定得调用super.layoutSubviews()

4.完成无限滚动

假如我们有5张图片,UICollectionView将会准备用5个cell进行显示(当然因为循环利用的机制在,所以创建出的cell并不一定是五个)。那么当我们显示到第五张图片的时候,如果要继续显示那么,应该显示第一张图片。这时候如果强制的用UICollciontVIew的方法强制拉回第一个cell,会有一个非常难看的向左滑动的动画,而不是继续向右滚动的动画。

为了实现无限滚动,我只能把cell的数量变多,在五张图片下,我让cell有500个或者更多,但是cell显示的图片却还是只有我们设置的那五张。并且在第一次显示的时候,让显示是cell是最中间的一张。这样,就照成了无限循环的假象。而且由于循环利用的机制的存在,是不用担心效率问题的。

这里定时器的问题也需要额外注意一下。反正要又这种意识,只要用到了定时器就要担心循环引用的问题。我的习惯是在开发的过程中,把所有用到的控制器也好,自定义的view也好。我总会加上它的析构方法deinit

5.添加PageControl

到达这一步,其实大概功能也都差不多了。而且代码量也有300多行了。是可以考虑对代码进行整理了(其实是我实在不能忍了)。

6整理代码,重构图片存取方式

7.添加pageControl对齐模式,并且将无限滚动功能变成协议

protocol PageControlAlimentProtocol: class{
    var pageControlAliment: PageControlAliment {get set}
    func AdjustPageControlPlace(pageControl: UIPageControl)
}

一个属性,便是开始定义的位置类型的枚举,要使用本协议,必须得提供这个属性。还有协议一个方法,是调节位置的协议方法。这里我在协议的扩展中给了它一个默认的实现。用户在任何需要改变位置的代码出直接调用即可。

8.进一步改进代码,并添加对storyboard的支持

总结

在编码过程中,我尽量多的使用swift的特性,代码写到第五步感觉和以前oc的思维都差不多。于是我强迫自己对代码进行修改。结果虽然是写出来了不一样的代码,但是不知道有没有过度重构,希望大家能够指出不足之处。当然这个CyclePictureView图片轮播器是可以拿到任何项目中去使用的。如果您发现任何BUG,或者有更好的建议或者意见,欢迎您的指出。邮箱:wxl19950606@163.com.感谢您的支持。

上一篇下一篇

猜你喜欢

热点阅读