如何为多个 UILabel 创建一个 tapGestureRecognizer?

Posted

技术标签:

【中文标题】如何为多个 UILabel 创建一个 tapGestureRecognizer?【英文标题】:How to create just one tapGestureRecognizer for several UILabels? 【发布时间】:2017-10-30 23:10:08 【问题描述】:

我正在尝试(但失败)只创建一个用于多个 UILabel 的 tapGestureRecognizer。

现在我正在为 viewDidLoad 中的每个标签创建一个单独的 tapGestureRecognizer 并将其添加到适当的标签中。我遇到了这个问题,因为每次触摸显然都应该调用不同的函数。

这就是我创建它们的方式:

@IBOutlet weak var buttonOne: UILabel!
@IBOutlet weak var buttonTwo: UILabel!

override func viewDidLoad() 
    super.viewDidLoad()

        //tapGestureRecognizer for buttonOne

        buttonOne.isUserInteractionEnabled = true
        let oneGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonOneAction))
        buttonOne.addGestureRecognizer(oneGestureRecognizer)

        //tapGestureRecognizer for buttonTwo

        buttonTwo.isUserInteractionEnabled = true
        let twoGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonTwoAction))
        buttonTwo.addGestureRecognizer(twoGestureRecognizer)

        ...

它们工作得很好,但是我如何以及在哪里只创建一个 tapGestureRecognizer 并将其添加到 viewDidLoad 到每个具有不同操作的标签中?

【问题讨论】:

为什么不用按钮而不是标签? 【参考方案1】:

只需为每个标签创建一个。

另一种方法是创建一个单击手势识别器,将其附加到所有目标视图的公共超级视图,然后编写一组代码进行命中测试,以确定轻击是否落在您的任何标签上,以及如果是这样,是哪一个,并为该标签分派所需的方法。

然而,这就是点击手势识别器的全部意义所在。您可能会花费几天时间来开发一堆代码,这些代码与使用多个轻击手势识别器相比没有任何好处。

【讨论】:

【参考方案2】:

正如@Duncan C 在 cmets 中已经提到的,您可以如下切换手势识别器视图:

class ViewController: UIViewController 

    @IBOutlet weak var buttonOne: UILabel!
    @IBOutlet weak var buttonTwo: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
        [buttonOne, buttonTwo].forEach 
            $0?.isUserInteractionEnabled = true
            $0?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapGesture)))
        
    

    @objc func tapGesture(_ gesture: UITapGestureRecognizer) 
        guard let label = gesture.view as? UILabel else  return 
        switch label 
        case buttonOne: print("buttonOne")
        case buttonTwo: print("buttonTwo")
        default: break
        
    

【讨论】:

...或者您也可以打开标签。不过,声明的目标是为每个标签调用不同的方法。 我认为切换手势比点击测试要容易得多 是的,发送者是一个手势识别器,但是每个手势识别器都有一个视图属性,也就是它所附加的视图。 我同意你的看法。我对命中测试的建议是“如果你真的想要,你可以这样做,但为什么”之类的答案。

以上是关于如何为多个 UILabel 创建一个 tapGestureRecognizer?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UILabel 添加换行符?

如何为 UILabel 字体更改设置动画?

如何为 UIButton 创建动态叠加层?

如何为 UILabel 设置“粗体”动态字体类型?

如何为 UILabel 设置黑色透明? [复制]

如何为 UILabel 指定一个约束以保持在 UISegmentedControl 的每个段下方居中?