在項(xiàng)目開(kāi)發(fā)中碰到一個(gè)滑動(dòng)選擇金額的需求,因?yàn)槭墙鹑陧?xiàng)目,涉及的數(shù)據(jù)都比較大据德,而且精確度要求還高鳄乏,剛開(kāi)始用了很笨的方法(利用UIScrollView動(dòng)態(tài)創(chuàng)建一個(gè)刻度尺子,后來(lái)發(fā)現(xiàn)這種方法不可行棘利,因?yàn)閿?shù)據(jù)大了橱野,會(huì)造成線程阻塞,界面假死善玫,甚至程序崩潰)水援,后來(lái)決定使用UICollectionView來(lái)實(shí)現(xiàn)一個(gè)可以與UITextField聯(lián)動(dòng)的滑動(dòng)選擇器。
思路:實(shí)現(xiàn)一個(gè)橫向滑動(dòng)的UICollectionView茅郎,每一個(gè)cell可以規(guī)定為1000(分10格蜗元,按實(shí)際需求分),再通過(guò)給定的最大值系冗,計(jì)算cell的個(gè)數(shù)奕扣,這樣就可以通過(guò)動(dòng)態(tài)數(shù)據(jù)創(chuàng)建一個(gè)左右滑動(dòng)的collectionView,最后通過(guò)collectionView的偏移量可以計(jì)算出滑動(dòng)選擇的結(jié)果是多少掌敬。通過(guò)scrollView的代理和監(jiān)聽(tīng)textField的變化惯豆,可以實(shí)現(xiàn)滑動(dòng)選擇金額與手動(dòng)輸入金額聯(lián)動(dòng)。
1.新建一個(gè)繼承UIScrollView的類HXBuyScrollView(繼承UIView也可以)奔害,并添加一個(gè)實(shí)例方法:
該實(shí)例方法中設(shè)置了最大值楷兽,最小值,以及默認(rèn)值(在collectionView中以偏移量標(biāo)識(shí))舀武。
2.在HXBuyScrollView上實(shí)例化一個(gè)橫向的UICollectionView拄养,并設(shè)置sectionHeader和sectionFooter(為了調(diào)整樣式离斩,沒(méi)有其他作用)银舱,
3.定制兩個(gè)collectionView的cell,這里選擇的是用xib創(chuàng)建的跛梗,樣式如下圖:
主要是第一個(gè)cell的樣式跟后面的不一樣寻馏,所以單獨(dú)拎出來(lái)寫(xiě),可以根據(jù)實(shí)際需求靈活改動(dòng)核偿。
4.通過(guò)上述實(shí)例方法設(shè)置collectionView的默認(rèn)偏移量诚欠,并計(jì)算section的個(gè)數(shù)
到此為止,一個(gè)帶刻度的滑動(dòng)選擇器基本構(gòu)造完成漾岳。
5.在需要用到此滑動(dòng)選擇器的地方實(shí)例化并添加HXBuyScrollView:
此處添加了一條中點(diǎn)判別線轰绵,和底部的線條,后來(lái)仔細(xì)一想尼荆,底部的線條可以放在collectionCell上的左腔,當(dāng)時(shí)居中的判別線還是單獨(dú)區(qū)分開(kāi)的。添加一個(gè)UITextField捅儒,簡(jiǎn)單的實(shí)現(xiàn)滑動(dòng)選擇器和文本輸入框的聯(lián)動(dòng):
6.設(shè)置滑動(dòng)選擇的最小精度液样,可以根據(jù)需求來(lái)調(diào)整
文本輸入的精度可以通過(guò)textField的代理實(shí)現(xiàn)振亮,可根據(jù)實(shí)際需求來(lái)調(diào)整,因?yàn)樯婕暗氖墙鹑陧?xiàng)目鞭莽,對(duì)數(shù)字的要求比較高坊秸,所以項(xiàng)目中的計(jì)算包括顯示都用的是NSDecimalNumber,為了精簡(jiǎn)代碼澎怒,有很多計(jì)算都刪除了褒搔,畢竟每個(gè)項(xiàng)目的需求都不一樣。