【问题标题】:How to create just one tapGestureRecognizer for several UILabels?如何为多个 UILabel 创建一个 tapGestureRecognizer?
【发布时间】: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 到每个具有不同操作的标签中?

【问题讨论】:

  • 为什么不用按钮而不是标签?

标签: ios swift uilabel uitapgesturerecognizer


【解决方案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
            }
        }
    }
    

    【讨论】:

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