显示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就可以显示resignFirstResponderresignFirstResponder来隐藏它。

有一个UIView子类可以方便地实现所有这些,以及UIPickerViewDelegateUIPickerViewDataSource方法。

附加一个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" } } 

希望有人认为这有用=)