先上效果圖
之前項目中要用到時間選擇器睛廊,時間比較緊就大概寫了個形真,湊合能用。閑下來了超全,這幾天把這個重新寫了下咆霜。大家可以看下效果,這里選中的那個效果的顏色和透明度都可以調(diào)嘶朱,還有星期和日期label的textColor都可以設(shè)置蛾坯,其余的不行。感覺項目上用的話改動不是太多的話直接用cocoapods管理吧疏遏。pod search YSXChooseTime_Swift
脉课。
如果改動較多的話,源碼在github上财异。就是以Date開頭的那3個文件倘零,自己下下來根據(jù)自己的需求改改。選中后能得到的數(shù)據(jù)就是第二張圖上面顯示的那些戳寸。功能確實也很單一视事。
下來說說我實現(xiàn)的思路吧
首先一頁要顯示7天,往前滑日期減小庆揩,往后滑日期增大俐东。在這要顯示的日期的整個控件我選擇UIScrollView。建立三個和屏幕寬度(就是你設(shè)置日期選擇器的高度和寬度)一樣的view订晌。為了后面方便虏辫,這3個view依次為leftView、midView锈拨、RightView
砌庄。然后將這3個view依次添加進UIScrollView中。初始時設(shè)置midView
中包含今天在內(nèi)的某一周奕枢,leftView
為前一周娄昆,rightView
為后一周。在這里再用三個變量toDay(今天)firstDay(包含toDay的周的星期一)lastDay(包含toDay的周的星期天)
缝彬。
根據(jù)toDay
算出firstDay和lastDay
萌焰。然后將得到的數(shù)據(jù)顯示到midView
上。再根據(jù)firstDay
算出前一周的數(shù)據(jù)谷浅,將這些數(shù)據(jù)設(shè)置到leftView
上扒俯。最后根據(jù)rightDay
算出后一周的數(shù)據(jù)奶卓,將這些數(shù)據(jù)設(shè)置到rightView
上。然后設(shè)置UIScrollView的偏移量為一個view的寬度撼玄,我這里view的寬度和屏幕的寬度設(shè)置的一樣夺姑。
self.contentOffset = CGPoint(x: self.bounds.size.width, y: 0)
這樣設(shè)置完之后UIScrollView第一次顯示時會顯示midView
,也就是包含當天的那一周。
下來就是左右滑動時數(shù)據(jù)該怎么處理和顯示
leftView,midView,rightView
肯定是要復用的掌猛,要不然每滑動一次就創(chuàng)建一個view效率太低盏浙!
在做滑動處理時我選擇的是scrollViewDidEndDecelerating
而不是scrollViewDidScroll。原因是scrollViewDidEndDecelerating是在滑動結(jié)束后才會調(diào)用荔茬,
scrollViewDidScroll是每次滑動都會調(diào)用很多次废膘。而且還有個最理想的地方是設(shè)置UIScrollView的偏移量時
self.contentOffset = CGPoint(x: self.bounds.size.width, y: 0)
不會觸發(fā)scrollViewDidEndDecelerating。這個是很有用的兔院。
下來就很簡單了殖卑,在每次滑動完之后判斷是向右滑動了還是向左滑動了站削。這里用向左滑動說明下(向左滑動手指向左坊萝,在時間選擇器上是顯示下一周)。
這時UIScrollView顯示的是```rightView```也就是當前周的下一周许起。然后根據(jù)```lastDay```重新設(shè)置```midView```上的數(shù)據(jù)十偶,使其顯示的數(shù)據(jù)和```rightView```上的一致。然后更新```firstDay```和```lastDay```园细,再更新```leftView```和```rightView```上的數(shù)據(jù)惦积。然后再設(shè)置UIScrollView的偏移量```self.contentOffset = CGPoint(x: self.bounds.size.width, y: 0)```又會顯示```midView```。此時的```midView```上顯示的是當前周的下一周猛频,```leftView```顯示的是當前周狮崩,```rightView```顯示的是當前周的下下周。向右滑動的處理方式和向左的處理方式相同鹿寻。就可以利用3個view來顯示一個時間選擇器睦柴。