UITapGestureRecognizer不适用于UILabel,但适用于父视图

时间:2018-11-07 13:51:05

标签: ios swift xcode

视图层次结构就是这样,

- control (UIView)
 - container (UIView)
     - icon (UILabel)
     - label(UILabel)

如果我尝试在控件上添加轻击手势,则效果很好。如果我尝试在其他任何项上添加addTap手势,则无法使用。

为每个元素启用

isUserInteractionEnabled。我还为每个元素都叫BringToFront

我还尝试设置UIGestureRecognizerDelegate和检测Touch事件,但它也没有检测到。

有什么主意吗?

这是代码,

func setGesture() {
//        self.isUserInteractionEnabled = true
//        containerView.isUserInteractionEnabled = true
        label.isUserInteractionEnabled = true
//        exclamationMark.isUserInteractionEnabled = true

        self.bringSubview(toFront: containerView)
        containerView.bringSubview(toFront: exclamationMark)

        label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapSavingLabel)))
        //exclamationMark.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapExclamationMarkButton)))
        //self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selfTapped)))
    }

    @objc func didTapExclamationMarkButton() {
        delegate?.didTapExclamationMarkButton()
    }

    @objc func didTapSavingLabel() {
        delegate?.didTapSavingLabel()
    }

    @objc func selfTapped() {
        print("Self Tapped")
    }

如果我取消注释“自拍”上的“轻按”手势,则效果很好。

2 个答案:

答案 0 :(得分:0)

我在Interface Builder中创建了插座,并连接到label变量。

已更新为新答案。 我认为您对标签有“惊叹号”视图。

其余的是下一个代码。

- controller
-- container
--- label


class ViewController: UIViewController {

    @IBOutlet weak var container: UIView!
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.label.isUserInteractionEnabled = true
        self.view.bringSubviewToFront(self.container)


        let tap = UITapGestureRecognizer(target: self, action: #selector(tapPerformed(_:)))
        self.label.addGestureRecognizer(tap)

    }

    @objc func tapPerformed(_ tap: UITapGestureRecognizer) {
        debugPrint(#function)
    }
}

答案 1 :(得分:0)

问题是标签的一个或多个超级视图的帧大小为0,0。当该视图的.clipsToBounds属性为false时,它允许在屏幕上看到其子视图(在这种情况下为标签),但它扩展到其超级视图的范围之外。

在这种情况下的任何视图将响应触摸/手势。

一旦解决了布局问题并正确设置了框架,添加到标签中的Tap Gesture就会按预期工作。