gpt4 book ai didi

ios - 如何在用户触摸已选择的行时隐藏 UIPIckerView

转载 作者:行者123 更新时间:2023-11-28 15:35:53 25 4
gpt4 key购买 nike

我的代码中有多个 UIPickerView,假设用户无意中打开了 PickerView,但想要保持选中同一行,就像我在用户触摸已选中的行时所做的那样,选择器隐藏?

我试过这个:UIPicker detect tap / touch on currently selected row , 但我无法让它工作。

--- 编辑---

我会尝试更具体一些。我是编程和 Swift 语言的初学者。

这是我的 ViewController.swift

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var colorLabel: UILabel!
@IBOutlet weak var sizeLabel: UILabel!

@IBOutlet weak var colorButton: UIButton!
@IBOutlet weak var sizeButton: UIButton!

@IBOutlet weak var resultButton: UIButton!

@IBOutlet weak var colorPickerView: UIPickerView! = UIPickerView()
@IBOutlet weak var sizePickerView: UIPickerView! = UIPickerView()

var colorPickerData = ["Blue", "Red"]
var sizePickerData = ["Small", "Big"]

var descri = String()
var resultadoImagem = UIImage()

override func viewDidLoad() {
super.viewDidLoad()


colorPickerView.isHidden = true
sizePickerView.isHidden = true


self.colorPickerView.delegate = self
self.colorPickerView.dataSource = self

self.sizePickerView.delegate = self
self.sizePickerView.dataSource = self


colorLabel.text = colorPickerData[0]
sizeLabel.text = sizePickerData[0]
}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 1 {
return colorPickerData.count
} else if pickerView.tag == 2 {
return sizePickerData.count
}
return 0
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 1 {
return "\(colorPickerData[row])"
} else if pickerView.tag == 2 {
return "\(sizePickerData[row])"
}
return ""
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView.tag == 1 {
colorLabel.text = colorPickerData[row]
colorPickerView.isHidden = true
} else if pickerView.tag == 2 {
sizeLabel.text = sizePickerData[row]
sizePickerView.isHidden = true
}
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
colorPickerView.isHidden = true
sizePickerView.isHidden = true
}

@IBAction func colorButton(_ sender: Any) {
colorPickerView.isHidden = !colorPickerView.isHidden
}

@IBAction func sizeButton(_ sender: Any) {
sizePickerView.isHidden = !sizePickerView.isHidden
}

@IBAction func resultButton(_ sender: Any) {
if (colorLabel.text == "Blue")
&& (sizeLabel.text == "Big") { resultadoImagem = UIImage(named: "blue-big.png")!; descri = "BLUE"}
else if (colorLabel.text == "Blue")
&& (sizeLabel.text == "Small") { resultadoImagem = UIImage(named: "blue-small.png)!; descri = "BLUE"}
else if (colorLabel.text == "Red")
&& (sizeLabel.text == "Big") { resultadoImagem = UIImage(named: "red-big.png")!; descri = "RED"}
else if (colorLabel.text == "Red")
&& (sizeLabel.text == "Small") { resultadoImagem = UIImage(named: "red-small.png")!; descri = "RED"}

self.performSegue(withIdentifier: "resultSegue", sender: nil)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "resultSegue" {
let DestViewController : SecondViewController = segue.destination as! SecondViewController

DestViewController.descText = descri
DestViewController.resultPhoto = resultadoImagem
}
}

}

这段代码效果很好,当我点击“结果”按钮时,它会转到 SecondViewController 并显示照片和描述。

我的困难是,colorPickerView 打开时选择了数据“Blue”,就像 sizerPickerView 默认打开时数据“Small”一样。当用户触摸已选择的数据时,我希望 pickerView 关闭/隐藏。

最佳答案

使类符合 UIGestureRecognizerDelegate 协议(protocol)

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UIGestureRecognizerDelegate { 
// ...
}

UITapGestureRecognizer 添加到您的 colorPickerView

let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapAction(_:)))
tap.cancelsTouchesInView = false
tap.delegate = self
colorPickerView.addGestureRecognizer(tap)

实现UIGestureRecognizerDelegate方法

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}

最后实现tapAction

func tapAction(_ tapRecognizer:UITapGestureRecognizer) {
if tapRecognizer.state == .ended {
let rowHeight : CGFloat = colorPickerView.rowSize(forComponent: 0).height
let selectedRowFrame: CGRect = colorPickerView.bounds.insetBy(dx: 0.0, dy: (colorPickerView.frame.height - rowHeight) / 2.0)
let userTappedOnSelectedRow = selectedRowFrame.contains(tapRecognizer.location(in: colorPickerView))
if (userTappedOnSelectedRow){
let selectedRow = colorPickerView.selectedRow(inComponent: 0)
//do whatever you want here
}
}
}

使用 sizerPickerView 重复步骤 2 和 4 以扩展功能。

关于ios - 如何在用户触摸已选择的行时隐藏 UIPIckerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44275020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com