写了个小轮子,其实和之前的三个图片轮播差异不大。看过一些第三方的小轮子,觉得都复杂化了,需要跟着一步一步做个理解才能自己custom代码,我觉得原理简单易懂,代码精简的轮子用着才爽,改起来效率也高。
这个小轮子原理很简单:有序号从1~5 5个图片,主显示的是第3张图片,每当滑动完毕之后切换数据赋值,然后重置到显示第3张。
为什么需要5张图片而不是之前的3张,请看图:

青色是处在正中间的图,也就是第3张图片,当滑动的时候,其右侧的最大可见度达到了第5张。
之前整理过的遇到的问题和解决方案:
说下遇到的问题和解决思路:
1.选择scrollerView和每个子视图一样大还是比每个都大一些显示出左右子视图?
考虑到整页滑动的效果这里必须要选择前者。如果你的scroll比每个子视图都大,那么整页滑动会使视图滑动位置错乱。至于显示出左右子视图,我们可以利用clipsTobounds的属性来达到这个效果。
2.在哪个代理方法中去修正下标达到对准数据源?
scrollViewDidEndDecelerating。这个方法中无论是拖拽还是定时器都会触发这个方法。
3.如何更简单地计算坐标问题?
关闭回弹效果bounces=NO。回弹效果会使计算坐标变化变得复杂和不稳定,关闭回弹在体验上也不会降低太多。
4.由于打开了clipsTobounds,可见区域有一部分是无法响应滑动的手势的,如何处理?
重写hitTest方法,传递滑动效果
5.图片固定5张,如果数据小于5张怎么处理?
监听数组变化,对应处理2、3、4三种情况,如果是3张,则数组中为:2、3、1、2、3状态
最后写出来之后发现一个小问题,由于是5张视图,当视图数量为2和4时效果会有些小问题,为2时数组调整为:a,b,a,b,a,此时开头的a和最后的a会首位相连有点小尴尬 - - ,后期想想怎么优化一下这个地方,最简单的就是再加一个视图,偶数视图个数可以解决这个小问题。
还没写放大缩小的效果,这个过几天加上,加的话其实方式也很简单,因为操作的视图只有2、3、4三张,不需要大量的判断处理。
大致的思路和做法都写在Demo中了:轮播图小轮子
网友评论