关闭带有双击手势识别器和 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)
我的主 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)