显示UIPickerView就像键盘一样,没有UITextField
我正在寻找一种方式来展示一个UIPickerView
当用户点击一个UIBarButtonItem
。 设想一下表格视图结果的filter。
我知道我可以使用UITextField
inputView,但事实并非如此 – 我只有一个UIBarButtonItem
和一个UITableView
。
我已经看到使用UIActionSheet ,但它看起来不自然,特别是当它animation显示。
将UIView
手动启动和closures屏幕手动唯一的select?
该应用程序是仅iOS 6和iPhone,所以我不需要保持兼容性的任何其他版本/成语。
它可能不是你唯一的select,但animation的UIPickerView应该相对容易为你做。 添加选取器视图,使其显示在屏幕的底部。 当它是在时间animation的时候:
[UIView animateWithDuration:0.3 animations:^{ self.datePicker.frame = CGRectMake(0, self.view.bounds.size.height - datePicker.bounds.size.height, datePicker.bounds.size.width, datePicker.bounds.size.height); }];
何时该隐藏它:
[UIView animateWithDuration:0.3 animations:^{ self.datePicker.frame = CGRectMake(0, self.view.bounds.size.height, datePicker.bounds.size.width, datePicker.bounds.size.height); }];
更好的select仍然是使用UITextField
。 您不必在屏幕上实际显示它。 只要把它放在一个0x0的UIView
这样它就不可inputView
,把它的inputView
设置到你的UIPickerView
并调用becomeFirstResponder
就可以显示resignFirstResponder
和resignFirstResponder
来隐藏它。
有一个UIView
子类可以方便地实现所有这些,以及UIPickerViewDelegate
和UIPickerViewDataSource
方法。
附加一个UIPickerView作为你添加到你的视图的0大小的UITextField的inputView。
let picker = UIPickerView() picker.dataSource = self picker.delegate = self let dummy = UITextField(frame: CGRectZero) view.addSubview(dummy) dummy.inputView = picker dummy.becomeFirstResponder()
我与borisgolovnev的隐形UITextField
的build议,并提出了以下Swift 2.3实现:
import UIKit class PickerViewPresenter: UITextField { // MARK: - Initialization required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } init() { super.init(frame: CGRect.zero) inputView = pickerView inputAccessoryView = pickerInputAccessoryView } // MARK: - Public var pickerDelegate: UIPickerViewDelegate? { didSet { pickerView.delegate = pickerDelegate } } var pickerDataSource: UIPickerViewDataSource? { didSet { pickerView.dataSource = pickerDataSource } } var selectButtonAction: (() -> Void)? var currentlySelectedRow: Int { return pickerView.selectedRowInComponent(0) } func selectRowAtIndex(index: Int) { pickerView.selectRow(index, inComponent: 0, animated: false) } func showPicker() { self.becomeFirstResponder() } func hidePicker() { self.resignFirstResponder() } // MARK: - Views private let pickerView = UIPickerView(frame: CGRect.zero) private lazy var pickerInputAccessoryView: UIView = { let frame = CGRect(x: 0.0, y: 0.0, width: 0.0, height: 48.0) let pickerInputAccessoryView = UIView(frame: frame) // Customize the view here return pickerInputAccessoryView }() func selectButtonPressed(sender: UIButton) { selectButtonAction?() } }
PickerViewPresenter可以方便地用于这样的:
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { override func viewDidLoad() { super.viewDidLoad() view.addSubview(pickerViewPresenter) } private let dataModel = [10, 20, 30, 40, 50] private lazy var pickerViewPresenter: PickerViewPresenter = { let pickerViewPresenter = PickerViewPresenter() pickerViewPresenter.pickerDelegate = self pickerViewPresenter.pickerDataSource = self pickerViewPresenter.selectButtonAction = { [weak self] () -> Void in guard let strongSelf = self else { return } let result = strongSelf.dataModel[pickerViewPresenter.currentlySelectedRow] pickerViewPresenter.hidePicker() // ... } return pickerViewPresenter }() private func presentPickerView { let index = 0 // [0..dataModel.count-1] pickerViewPresenter.selectRowAtIndex(index) pickerViewPresenter.showPicker() } // MARK: - UIPickerViewDataSource func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return dataModel.count } // MARK: - UIPickerViewDelegate func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return "\(dataModel[row]) drunken sailors" } }
希望有人认为这有用=)