無限循環選擇的PickerView
這次剛好有需要做一個PickerView,但因為本身沒有無限循環的功能,所以必須自己做
做法非常簡單,只是一開始做的時候”數學”要想一下,就是將Pickerview的rows數量定為一個非常大的數量,但不是隨便定義的,請看以下:
放置PickerView及outlet就不介紹了,就直接進入到程式碼吧
- class裡先放上要顯示的東西,我是定義一個了台灣縣市名稱陣列
let citysName = [“不選擇”,”臺北市”,”新北市”,”基隆市”,”宜蘭縣”,”桃園縣”,”新竹縣”,”新竹市”,”苗栗縣”,”臺中市”,”彰化縣”,”南投縣”,”雲林縣”,”嘉義縣”,”嘉義市”,”臺南市”,”高雄市”,”屏東縣”,”花蓮縣”,”臺東縣”,”澎湖縣”,”金門縣”,”連江縣”]
2. 重要的第二步驟,定義一個上面陣列的數量的”偶數倍”如2、4、6、8、10以此類推,我要設為1000倍,所以訂一個常數:let aNumber = 230000
3.只有一個pickerView所以回傳1
func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1}
4.回傳裡面數量,我們回傳第二步驟定義的常數
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return aNumber}
5.要顯示的title,這裡要想一下,因為我們真正其實才23個,不可能有第24個可以顯示,所以用%取餘數,像如果是第一個row的index是0,0除以23的餘數是0,就是citysName[0]=不選擇,第24個row的index是23,23除以23一樣是0,所以餘數只會一直在0到22間重複,就不會有out of range的問題了
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return citysName[row % citysName.count]}
6.另一個重點,在viewdidLoad的時候設定讓pickerView選到中間的那一個row就是aNumber / 2,這就是要第二步驟的常數要是偶數倍的原因,這樣一顯示出來就會剛好選到中間的第0個row,就會是citysName[0]=不選擇,然後使用者不管是往上滑或者往下滑都不可能一次就滑到底,就會很像是一個無限循環,動畫要關掉
override func viewDidLoad() { super.viewDidLoad() myPicker.selectRow(aNumber / 2, inComponent: 0, animated: false)}
做到這裡就可以正常顯示及滾動了
7.最後是didSelectRow的處理,我們讓使用者每次選到後馬上回到中間的那段陣列,意思就是其實不管使用者怎選,最後都是回到中間那段去選擇,只是動畫要關掉,這樣就看不出來了,row % citysName.count上面也有出現,他的值只會是0~22
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let position = aNumber / 2 + row % citysName.count myPicker.selectRow(position, inComponent: 0, animated: false) myLabel.text = "您選到的是:" + citysName[row % citysName.count]}
以上就是無限循環的PickerView。