首页 > 解决方案 > 通过 UILabel 使用多个轻击手势

问题描述

我正在创建一个UILabel需要两个手势,单击和双击。

class ViewController: UIViewController, UIGestureRecognizerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(labelView)
    labelView.topAnchor.constraint(equalTo: view.topAnchor),
        quoteLabelView.leadingAnchor.constraint(equalTo: 
    view.leadingAnchor),
        quoteLabelView.trailingAnchor.constraint(equalTo: 
    view.trailingAnchor),
        quoteLabelView.bottomAnchor.constraint(equalTo: 
    view.topAnchor),
}

var labelView: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.isUserInteractionEnabled = true
    let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap))
    let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
    singleTapGesture.numberOfTapsRequired = 1
    doubleTapGesture.numberOfTapsRequired = 2
    label.addGestureRecognizer(singleTapGesture)
    label.addGestureRecognizer(doubleTapGesture)
    return label
}()

}

我阅读了苹果文档,其中提供了有关偏好一种手势而不是另一种手势的信息,但我不知道如何将其应用于标签。 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                       shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    // Don't recognize a single tap until a double-tap fails.
    if gestureRecognizer == self.tapGesture &&
        otherGestureRecognizer == self.doubleTapGesture {
        return true
    }
    return false
}

有任何想法吗?

标签: iosswiftuigesturerecognizer

解决方案


如果你想在你的标签声明中添加你的手势识别器,你最好使用单独的函数来进行单击和双击:

class TestViewController: UIViewController {

    lazy var labelView: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.isUserInteractionEnabled = true

        let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didSingleTap(_:)))
        singleTapGesture.numberOfTapsRequired = 1
        label.addGestureRecognizer(singleTapGesture)

        let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap(_:)))
        doubleTapGesture.numberOfTapsRequired = 2
        label.addGestureRecognizer(doubleTapGesture)

        singleTapGesture.require(toFail: doubleTapGesture)

        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // add the labelView        
        view.addSubview(labelView)

        // set a couple properties
        labelView.text = "Tap or Double-Tap Me"
        labelView.textAlignment = .center
        labelView.backgroundColor = .yellow

        // constrain it to the view
        NSLayoutConstraint.activate([
            labelView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200),
            labelView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            labelView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        ])

    }

    @objc func didSingleTap(_ gesture: UITapGestureRecognizer) -> Void {
        print("Did Single Tap")
    }

    @objc func didDoubleTap(_ gesture: UITapGestureRecognizer) -> Void {
        print("Did Double Tap")
    }

}

推荐阅读