如何用UIPickerView实现首位为0/1的4位数字选择器?
实现首位仅支持0/1的4位循环数字选择器
嘿,我看你要做一个4位数字选择器,而且第一位只能选0或1,从你给出的UIPickerView代码片段来看,你还想做循环滚动的效果(毕竟用到了loopingMargin和row % numbers.count)。那咱们来一步步调整代码,满足你的需求:
1. 区分不同组件的行数
你现在的numberOfRowsInComponent是统一返回loopingMargin * numbers.count,但第一个组件只需要0和1两个选项,所以得针对组件下标做判断:
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { // 第一个组件只有0、1两个值,行数是循环倍数*2 if component == 0 { return loopingMargin * 2 } // 剩下三个组件是0-9,行数是循环倍数*10 return loopingMargin * 10 }
2. 调整每行的标题显示
同样,第一个组件的行要对应0或1,其他组件对应0-9:
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if component == 0 { // 取模2,循环显示0、1 return "\(row % 2)" } // 其他组件取模10,循环显示0-9 return "\(row % 10)" }
3. 优化初始选中位置(可选)
为了让循环滚动更自然,建议初始化时让每个组件选中中间位置的行,比如:
override func viewDidLoad() { super.viewDidLoad() // 假设loopingMargin是一个较大的偶数,比如1000 let middleOffset = loopingMargin / 2 // 第一个组件选中中间的0/1行(这里选0的中间位置,也可以选1) weightPickerView.selectRow(middleOffset * 2, inComponent: 0, animated: false) // 其他组件选中中间的5(视觉上更居中) for component in 1...3 { weightPickerView.selectRow(middleOffset * 10 + 5, inComponent: component, animated: false) } }
4. 获取用户选中的数字
当你需要拿到最终选中的4位数字时,也要对应处理每个组件的取模逻辑:
func getSelected4Digits() -> [Int] { var digits = [Int]() for component in 0...3 { let selectedRow = weightPickerView.selectedRow(inComponent: component) digits.append(component == 0 ? selectedRow % 2 : selectedRow % 10) } return digits }
这样调整后,第一个组件就只能滚动选择0和1,剩下三个组件正常显示0-9,同时完美保留了你想要的循环滚动效果哦~
内容的提问来源于stack exchange,提问作者arakweker
相关产品推荐
相关产品推荐

