
[英]Select multiple rows in UIPickerView only when tapped (not when scrolling to a row)
[英]I want user to select country only when he/she tapped on uipickerview in swift 3
我已经在UIPickerView中创建了国家列表,并在UItextField中对其进行了调用。 现在,我希望用户点击UIPIckerView选择国家名称。 我对堆栈溢出进行了一些研究,发现(令人惊讶的是!)这样做并不容易。 我为此编写了以下代码,它向我显示了以下错误:
Cannot convert value of type 'CGRect' to expected argument type 'CGFloat'
是否有简单的方法来做..这是非常基本的要求,应该非常简单; 否则,有人可以帮助解决我在创建点击功能时遇到的错误吗
下面是我的代码
class StudentSignUpViewController: UIViewController,UIScrollViewDelegate, UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource, UIGestureRecognizerDelegate {
@IBOutlet weak var countryText: UITextField!
@IBOutlet weak var scrollView: UIScrollView!
///who are you option dropdown box
var picker = UIPickerView()
override func viewDidLoad() {
super.viewDidLoad()
//setting portrait
AppUtility.lockOrientation(.portrait)
//hide keyboard when click outside
self.hideKeyboardWhenTappedAround()
//hide keyboard when click on return
self.countryText.delegate = self
self.scrollView.delegate = self
picker.delegate = self
picker.dataSource = self
self.countryText.inputView = picker
let tap = UITapGestureRecognizer(target: self, action: #selector(pickerTapped))
tap.cancelsTouchesInView = false
tap.delegate = self
picker.addGestureRecognizer(tap)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
AppUtility.lockOrientation(.portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
AppUtility.lockOrientation(.all)
}
//*************************************************************** creating dropdown for country list ***************************************************************
let countries = NSLocale.isoCountryCodes.map { (code:String) -> String in
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
return NSLocale(localeIdentifier: "en_US").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.countries.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return self.countries[row];
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
self.countryText.text = self.countries[row];
self.countryText.endEditing(true)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true}
@objc func pickerTapped(tapRecognizer:UITapGestureRecognizer)
{
if (tapRecognizer.state == UIGestureRecognizerState.ended)
{
let frame = CGRect.zero
let rowHeight : CGFloat = self.picker.rowSize(forComponent: 0).height
let selectedRowFrame: CGRect = frame.insetBy(dx: self.picker.bounds, dy: (self.picker.frame.height - rowHeight) / 2.0 ) //Error: Cannot convert value of type 'CGRect' to expected argument type 'CGFloat'
let userTappedOnSelectedRow = (selectedRowFrame.contains(tapRecognizer.location(in: picker)))
if (userTappedOnSelectedRow)
{
self.picker.selectedRow(inComponent: 0)
}
}
}
}
根据苹果的标准,您应该将toolbar
添加到pickerview中,并done
一个按钮,该按钮将关闭pickerview。 通过滚动pickerview行并将选定的行保持在中心段,已经可以完成选择。 但是,如果您的要求非常严格,则应创建自己的自定义组件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.