Ios 以编程方式创建的按钮与viewController的手势识别器冲突

Ios 以编程方式创建的按钮与viewController的手势识别器冲突,ios,swift,sprite-kit,skspritenode,Ios,Swift,Sprite Kit,Skspritenode,关于我的最后一个问题: 我正在开发一款SpriteKit游戏:用户可以点击和滑动屏幕,在场景中移动精灵,为此我在ViewController中添加了手势识别器。 然后,我创建了一个HUD,以保留4个以编程方式创建的按钮,用户可以使用这些按钮将其他精灵添加到场景中。 我希望我的按钮在按下时淡入淡出并缩放一点,然后返回到原始状态,但它们似乎与viewController的手势识别器冲突:按钮淡入淡出并缩放,但它们保持在该状态,不会返回到正常状态。 我能做什么? 这是Button类: 我不认为它们会干

关于我的最后一个问题:

我正在开发一款SpriteKit游戏:用户可以点击和滑动屏幕,在场景中移动精灵,为此我在ViewController中添加了手势识别器。 然后,我创建了一个HUD,以保留4个以编程方式创建的按钮,用户可以使用这些按钮将其他精灵添加到场景中。 我希望我的按钮在按下时淡入淡出并缩放一点,然后返回到原始状态,但它们似乎与viewController的手势识别器冲突:按钮淡入淡出并缩放,但它们保持在该状态,不会返回到正常状态。 我能做什么? 这是Button类:


我不认为它们会干扰视图控制器的内置手势识别器,因为您没有添加任何自己的手势,您只是覆盖了touchesBegin和touchesEnded

打印出来了吗

可能没有调用touchesEnd,也可以尝试实现touchesCancelled,看看是否会调用它

解决了! 好吧,这比我想象的要简单。 我休息了一会儿。 -我删除了UIS手势,并以编程方式添加它们; -在我的游戏场景的touchesend方法中,我创建了一个条件来检查我的哪个节点被触摸过。 -在视图控制器中,我添加了GestureRecognitor_u3;:shouldRecognitizeSimultaneousyWith:方法,以避免与连接到不同视图的手势识别器发生冲突。我的节点位于两个不同的视图中:


我希望这会有帮助……

不,touchesEnd没有被呼叫,tapped没有打印。。。但在将手势识别器添加到GameViewController之前,一切都很好。我加上它们后,我的按钮停止工作了。如果我按下一个按钮,它会消失和缩放,但保持在该状态,不会回到正常状态。我在你发布的代码中没有看到任何手势识别器。昨天我更改并添加了代码:平移、轻触和手势识别器应用于视图,因此用户可以在其中移动精灵。但在我加上它们之后,我的按钮停止工作了。我真的不知道如何解决这个问题。
import SpriteKit
protocol ButtonDelegate: NSObjectProtocol {
    func buttonClicked(sender: Button)
}
class Button: SKSpriteNode {
    weak var delegate: ButtonDelegate!
    var buttonTexture = SKTexture()
    init(name: String) {
        buttonTexture = SKTexture(imageNamed: name)
        super.init(texture: buttonTexture, color: .clear, size: buttonTexture.size())
        self.isUserInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
var touchEndedCallback: (() -> Void)?
weak var currentTouch: UITouch?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if isUserInteractionEnabled {
        setScale(0.9)
        self.alpha = 0.5
        if let currentTouch = touches.first {
            let touchLocation = currentTouch.location(in: self)
            for node in self.nodes(at: touchLocation) {
                delegate?.buttonClicked(sender: self)
            }
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    setScale(1.0)
    self.alpha = 1.0
    touchEndedCallback?()
    print("tapped!")
}
}
class ViewController: UIViewController, UIGestureRecognizerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        let skView = view as! SKView
        skView.isMultipleTouchEnabled = false
        skView.presentScene(scene)
    @IBAction func didTap(_ sender: UITapGestureRecognizer) {
        game.myCode
    }
    @IBAction func didPan(_ sender: UIPanGestureRecognizer) {
        let currentPoint = sender.translation(in: self.view)
        if let originalPoint = panPointReference {
            if abs(currentPoint.x - originalPoint.x) > (SquareSize * 0.9) {
                if sender.velocity(in: self.view).x > CGFloat(0) {
                    //game.myCode
                    panPointReference = currentPoint
                } else {
                    //game.myCode
                    panPointReference = currentPoint
                }
            }
        } else if sender.state == .began {
            panPointReference = currentPoint
        }
    }
    @IBAction func didSwipe(_ sender: UISwipeGestureRecognizer) {
        //game.myCode
    }
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive shouldReceiveTouch: UITouch) -> Bool {
        if UITouch .isKind(of: Button.self) {
            return false
        }
        return true
    }
    func buttonClicked(sender: Button) {
        //myCode
    }
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer.view != otherGestureRecognizer.view {
        return false
    }
    return true
}