Ios 我在视图中添加了一个UIGestureReconizer来检测触地动作,但是视图上方的按钮无效';我不再工作了

Ios 我在视图中添加了一个UIGestureReconizer来检测触地动作,但是视图上方的按钮无效';我不再工作了,ios,swift,uigesturerecognizer,Ios,Swift,Uigesturerecognizer,我有一个视图需要在全视图上检测“触地”操作,当我发现普通UIAppgestureRecognizer无法完成此操作后,我定制UIestureRecognizer类来实现它 所以它确实可以工作,但我在视图上有几个按钮,在我可以检测到视图的触地动作后,这些按钮停止工作。 我需要两者都工作,视图检测触地,按钮可以在视图上方按下。我怎样才能做到呢 为了清楚起见,这些按钮只需要检测内部的正常触碰动作,只有视图需要检测触碰动作。此外,当按钮上发生触摸事件时,视图不需要对触摸事件做出反应 谢谢 导入UIKit

我有一个视图需要在全视图上检测“触地”操作,当我发现普通UIAppgestureRecognizer无法完成此操作后,我定制UIestureRecognizer类来实现它

所以它确实可以工作,但我在视图上有几个按钮,在我可以检测到视图的触地动作后,这些按钮停止工作。 我需要两者都工作,视图检测触地,按钮可以在视图上方按下。我怎样才能做到呢

为了清楚起见,这些按钮只需要检测内部的正常触碰动作,只有视图需要检测触碰动作。此外,当按钮上发生触摸事件时,视图不需要对触摸事件做出反应

谢谢

导入UIKit
导入UIKit.UIgestureRecognitizerSubclass
类ViewController:UIViewController{
重写func viewDidLoad(){
super.viewDidLoad()
设t=SingleTouchDownGestureRecognitor(目标:self,动作:#选择器(handleTap(发送方:))
self.view.addgestureRecognitor(t)
}
@objc func handleTap(发送方:UITAPGESTURE识别器?=nil){
self.view.backgroundColor=#colorLiteral(红色:0.2392156869,绿色:0.6745098233,蓝色:0.9686274529,alpha:1)
UIView.animate(持续时间:1){
self.view.backgroundColor=#colorLiteral(红色:1,绿色:1,蓝色:1,alpha:1)
}
}
@iAction func testBtnPressed(\发送方:任意){
打印(“testBtnPressed!”)
}
}
类SingleTouchDownGestureRecognitor:UIGestureRecognitor{
覆盖func touchesStart(touchs:Set,带有事件:UIEvent){
如果self.state==。可能{
self.state=.recogned
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent){
self.state=.failed
}
覆盖func touchesend(touchs:Set,带有事件:UIEvent){
self.state=.failed
}
}

您可以将TouchsBegind has Touchs中的事件与指定手势识别器的视图相同的视图进行比较

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        guard let view = self.view else { return }
        guard let touches = event.touches(for: view) else { return }
        super.touchesBegan(touches, with: event)
        if self.state == .possible {
            self.state = .recognized
        }
    }
override func touchsbegind(touch:Set,带有事件:UIEvent){
guard let view=self.view else{return}
guard let touchs=event.touchs(for:view)else{return}
super.touchesbeated(touches,with:event)
如果self.state==。可能{
self.state=.recogned
}
}

您可以将TouchsBegind has Touchs中的事件与指定手势识别器的视图相同的视图进行比较

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        guard let view = self.view else { return }
        guard let touches = event.touches(for: view) else { return }
        super.touchesBegan(touches, with: event)
        if self.state == .possible {
            self.state = .recognized
        }
    }
override func touchsbegind(touch:Set,带有事件:UIEvent){
guard let view=self.view else{return}
guard let touchs=event.touchs(for:view)else{return}
super.touchesbeated(touches,with:event)
如果self.state==。可能{
self.state=.recogned
}
}

这很有效!以前不知道这种方法,也无法在网上找到解决方案。谢谢!这管用!以前不知道这种方法,也无法在网上找到解决方案。谢谢!