RxInfinitePicker
InfinitePicker
是一个用于 iOS 的定制无限选择器,它可以帮助您使用自定义单元格创建无限选择器。 InfinitePicker
还支持与 RxSwift
扩展一起使用 (https://github.com/ReactiveX/RxSwift)。
示例
要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
文档
InfinitePicker 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'InfinitePicker'
自定义单元格
以下代码是一个自定义单元格的示例。自定义单元格类 NumberPickerCell
是通用类 InfinitePickerCell 的子类。 Int
是此自定义单元格的模式类型。
以下属性应该被覆盖
model
: 覆盖模式属性以设置单元格的数据。isSelected
:重写 isSelected 属性以设置选中效果。
class NumberPickerCell: InfinitePickerCell<Int> {
private lazy var numberLabel: UILabel = {
let label = UILabel()
label.textColor = .white
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 23, weight: .bold)
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(containerView)
createConstraints()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// Override the model property to set data for the cell.
override var model: Int? {
didSet {
guard let number = model else {
return
}
numberLabel.text = String(number)
}
}
// Override the isSelected property to set a selected effect.
override var isSelected: Bool {
didSet {
numberLabel.textColor = isSelected ? .yellow : . white
}
}
// ...
}
使用 InfinitePicker
在你的视图控制器类中创建一个选择器。泛型类型必须与自定义类中的类型相同。
private lazy var numberPicker: RxInfinitePicker<Int> = {
let picker = RxInfinitePicker<Int>(
itemSize: CGSize(width: 50, height: 50),
scrollDirection: .vertical,
spacing: 10,
cellType: NumberPickerCell.self
)
picker.delegate = self
return picker
}()
将数据设置到选择器中。
override func viewDidLoad() {
super.viewDidLoad()
//...
numberPicker.items = Array(1 ... 9)
}
在 InfinitePickerDelegate
代理中获取选中的项。
extension CustomizedViewController: InfinitePickerDelegate {
func didSelectItem(at index: Int) {
numberLabel.text = "didSelectItem \(index)"
}
}
与 RxSwift 扩展一起使用。
picker.rx.itemSelected.subscribe(onNext: { [unowned self] in
self.viewModel.pick(at: $0)
}).disposed(by: disposeBag)
viewModel.items.bind(to: picker.rx.items).disposed(by: disposeBag)
viewModel.selectedIndex.bind(to: picker.rx.selectedIndex).disposed(by: disposeBag)
作者
lm2343635, [email protected]
许可证
InfinitePicker 采用 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。