先上效果图
之前项目中要用到时间选择器,时间比较紧就大概写了个,凑合能用。闲下来了,这几天把这个重新写了下。大家可以看下效果,这里选中的那个效果的颜色和透明度都可以调,还有星期和日期label的textColor都可以设置,其余的不行。感觉项目上用的话改动不是太多的话直接用cocoapods管理吧。pod search YSXChooseTime_Swift
。
如果改动较多的话,源码在github上。就是以Date开头的那3个文件,自己下下来根据自己的需求改改。选中后能得到的数据就是第二张图上面显示的那些。功能确实也很单一。
下来说说我实现的思路吧
首先一页要显示7天,往前滑日期减小,往后滑日期增大。在这要显示的日期的整个控件我选择UIScrollView。建立三个和屏幕宽度(就是你设置日期选择器的高度和宽度)一样的view。为了后面方便,这3个view依次为leftView、midView、RightView
。然后将这3个view依次添加进UIScrollView中。初始时设置midView
中包含今天在内的某一周,leftView
为前一周,rightView
为后一周。在这里再用三个变量toDay(今天)firstDay(包含toDay的周的星期一)lastDay(包含toDay的周的星期天)
。
根据toDay
算出firstDay和lastDay
。然后将得到的数据显示到midView
上。再根据firstDay
算出前一周的数据,将这些数据设置到leftView
上。最后根据rightDay
算出后一周的数据,将这些数据设置到rightView
上。然后设置UIScrollView的偏移量为一个view的宽度,我这里view的宽度和屏幕的宽度设置的一样。
self.contentOffset = CGPoint(x: self.bounds.size.width, y: 0)
这样设置完之后UIScrollView第一次显示时会显示midView
,也就是包含当天的那一周。
下来就是左右滑动时数据该怎么处理和显示
leftView,midView,rightView
肯定是要复用的,要不然每滑动一次就创建一个view效率太低!
在做滑动处理时我选择的是scrollViewDidEndDecelerating
而不是scrollViewDidScroll。原因是scrollViewDidEndDecelerating是在滑动结束后才会调用,
scrollViewDidScroll是每次滑动都会调用很多次。而且还有个最理想的地方是设置UIScrollView的偏移量时
self.contentOffset = CGPoint(x: self.bounds.size.width, y: 0)
不会触发scrollViewDidEndDecelerating。这个是很有用的。
下来就很简单了,在每次滑动完之后判断是向右滑动了还是向左滑动了。这里用向左滑动说明下(向左滑动手指向左,在时间选择器上是显示下一周)。
这时UIScrollView显示的是```rightView```也就是当前周的下一周。然后根据```lastDay```重新设置```midView```上的数据,使其显示的数据和```rightView```上的一致。然后更新```firstDay```和```lastDay```,再更新```leftView```和```rightView```上的数据。然后再设置UIScrollView的偏移量```self.contentOffset = CGPoint(x: self.bounds.size.width, y: 0)```又会显示```midView```。此时的```midView```上显示的是当前周的下一周,```leftView```显示的是当前周,```rightView```显示的是当前周的下下周。向右滑动的处理方式和向左的处理方式相同。就可以利用3个view来显示一个时间选择器。