無限循環選擇的PickerView

Henry Huang
4 min readJul 5, 2018

--

這次剛好有需要做一個PickerView,但因為本身沒有無限循環的功能,所以必須自己做

做法非常簡單,只是一開始做的時候”數學”要想一下,就是將Pickerview的rows數量定為一個非常大的數量,但不是隨便定義的,請看以下:

放置PickerView及outlet就不介紹了,就直接進入到程式碼吧

  1. 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。

--

--

Henry Huang
Henry Huang

Written by Henry Huang

大學讀企管/退伍後在業務圈打滾6年後突然有一天決定投入完全沒接觸過的程式設計/目前為一位iOS Developer/熱愛NBA/dafu1231@gmail.com

No responses yet