fes
fes

Reputation: 2515

UILabel TapGesture not firing

Any idea why the Tap gesture on a UI Label will not fire?

I've tried using a delegate also but in its simplest form, for some reason it will just not hit the action method.

Is the UIView layer restricting this interaction?

class TestTextViewLabel : UIView {
    weak var testTextView: UITextView!
    weak var testLabel: UILabel!

    override init(frame: CGRect) {
        super.init(frame: frame)

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(testLabelTapped(_:)))

        let testUITextView: UITextView = {
            let textView = UITextView()
            textView.textColor = UIColor(hex: "#000")
            textView.translatesAutoresizingMaskIntoConstraints = false
            return textView
        }()

        let testUILabel: UILabel = {
            let label = UILabel()
            label.textColor = UIColor(hex: "#666666")!
            label.translatesAutoresizingMaskIntoConstraints = false

            label.addGestureRecognizer(tapGesture)
            label.isUserInteractionEnabled = true

            return label
        }()

        self.addSubview(testUITextView)
        self.addSubview(testUILabel)

        self.testTextView = testUITextView
        self.testLabel = testUILabel

        testUITextView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
        testUITextView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
        testUITextView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true

        testUILabel.topAnchor.constraint(equalTo: testUITextView.bottomAnchor, constant: 50).isActive = true
        testUILabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
        testUILabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func testLabelTapped(_ sender: UITapGestureRecognizer) {
        print("testLabelTapped")
    }
}

Upvotes: 1

Views: 132

Answers (1)

CentrumGuy
CentrumGuy

Reputation: 646

I tried running your class and I was able to get the UILabel to fire after putting text into it. The tap gesture is only recognized within the view's bounds and since you didn't have any text in the UILabel, the bounds were zero giving you no place to click it. By default, if you put in text, the UILabel will automatically match those bounds. Here is my working code below:

class TestTextViewLabel : UIView {
    weak var testTextView: UITextView!
    weak var testLabel: UILabel!

    override init(frame: CGRect) {
        super.init(frame: frame)

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(testLabelTapped(_:)))

        let testUITextView: UITextView = {
            let textView = UITextView()
            textView.textColor = UIColor.black
            textView.translatesAutoresizingMaskIntoConstraints = false
            textView.text = "This is a text view"

            textView.backgroundColor = .clear
            return textView
        }()

        let testUILabel: UILabel = {
            let label = UILabel()
            label.textColor = UIColor(red:0.40, green:0.40, blue:0.40, alpha:1.0)
            label.translatesAutoresizingMaskIntoConstraints = false

            label.addGestureRecognizer(tapGesture)
            label.isUserInteractionEnabled = true

            label.text = "This is a UILabel view"

            return label
        }()

        self.addSubview(testUITextView)
        self.addSubview(testUILabel)

        self.testTextView = testUITextView
        self.testLabel = testUILabel

        testUITextView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
        testUITextView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
        testUITextView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true

        testUILabel.topAnchor.constraint(equalTo: testUITextView.bottomAnchor, constant: 50).isActive = true
        testUILabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
        testUILabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func testLabelTapped(_ sender: UITapGestureRecognizer) {
        print("testLabelTapped")
    }
}

Upvotes: 1

Related Questions