关闭带有双击手势识别器和 swift 流的 pangesturderecognizer

turn off a pangesturderecognizer with a double tapgesturerecognizer and a swift flow

我的主 UI 上有一个按钮,我可以使用它以编程方式创建视图。那是在底部。它们以绿色圆圈的形式出现,我可以使用 PanGestureRecognizer 来移动它。

我的目标是用 TapGestureRecognizer 关闭 PanGestureRecognizer(我希望它是双击),一旦我双击它,就基本上锁定该特定视图。

这是我目前拥有的代码。当我点击视图时,它实际上会改变颜色,但我不知道如何引用 PanGestureRecognizer 来禁用它。

class MakeACircle: UIView {
var circleCenter = CGPoint()
    let tap = UITapGestureRecognizer()
    let panGesture = UIPanGestureRecognizer()
    var checkSomething = 1



    init() {

        super.init(frame: CGRect(x: 0.0, y: 0.0, width: 100, height: 100))
        self.layer.cornerRadius = 50.0
        self.backgroundColor = UIColor.green
        self.isUserInteractionEnabled = true
        UITapGestureRecognizer().numberOfTapsRequired = 2
        }

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

    func dragCircle(gesture: UIPanGestureRecognizer) {
        let target = gesture.view!

        switch gesture.state {
        case .began, .ended:
            circleCenter = target.center
        case .changed:
            let translation = gesture.translation(in: self.superview)
            target.center = CGPoint(x: circleCenter.x + translation.x, y: circleCenter.y + translation.y)
        default: break
        }
    }

    func freeze(gesture: UITapGestureRecognizer) {

            switch checkSomething {
            case 1:
                self.panGesture.isEnabled = false
                self.backgroundColor = UIColor.blue
                checkSomething += 1
                print(checkSomething)


            case 2:
                self.panGesture.isEnabled = true
                self.backgroundColor = UIColor.red
                checkSomething -= 1
                print(checkSomething)

            default:
                break
            }

        }
}

我正在使用此 IBButton 以编程方式创建视图

@IBAction func makeACircle(_ sender: UIButton) {
    let something = MakeACircle()
    self.view.addSubview(something)

    something.addGestureRecognizer(UIPanGestureRecognizer(target: something, action: #selector(something.dragCircle(gesture:))))
    something.addGestureRecognizer(UITapGestureRecognizer(target: something, action: #selector(something.freeze(gesture:))))

    something.center = self.view.center

}

水龙头工作,正如你所看到的,我在那里有一个开关来改变它的颜色..它打印数字并改变颜色..但只需轻轻一按,锅就会保持打开状态。

非常感谢任何见解!这是我第一次执行此操作,我知道我就在门口,但我就是想不通。

看起来您在添加 MakeACircle() 对象时并未存储对 self.panGesture 的引用,因此当您尝试禁用它时,它不会执行任何操作。 self.panGesture 在哪里设置?

而不是这个:

something.addGestureRecognizer(UIPanGestureRecognizer(target: something, action: #selector(something.dragCircle(gesture:))))

试试这个:

something.panGesture = UIPanGestureRecognizer(target: something, action: #selector(something.dragCircle(gesture:)))
something.addGestureRecognizer(something.panGesture)

更新

对于您的点击手势识别器,请确保您也以与使用 panGesture 相同的方式存储对它的引用。

在你的 init() 中,你有:

UITapGestureRecognizer().numberOfTapsRequired = 2

但这不会做任何事情,因为它与您在说

时添加的点击手势不同
something.addGestureRecognizer(UITapGestureRecognizer(...))

所以你应该像使用其他手势那样做一些事情

something.tap = UITapGestureRecognizer(target: something, action: #selector(whatever))
something.tap.numberOfTapsRequired = 2
something.addGestureRecognizer(something.tap)