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



指的是我的最后一个问题:

Spritekit:从UIButtons传递到按钮作为SKSpriteNode。

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

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
}
}

解决了!
好吧,它比我想象的要简单。
(我休息了一下(。
- 我删除了UI手势并以编程方式添加它们;
- 在我的 GameScene 的 touchesEnd 方法中,我创建了一个条件来检查我的哪个节点被触摸了。
- 在视图控制器中,我添加了
gestureRecognizer(_:shouldRecognizeSimultaneous With:( 方法,以避免与附加到不同视图的手势识别器发生冲突(我的节点位于两个不同的视图中(:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer.view != otherGestureRecognizer.view {
return false
}
return true
}


我希望这会有所帮助...

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

"点击"会被打印出来吗?

touchesEnd(( 可能没有被调用,尝试实现 touchesCancel(( 并查看是否被调用。

最新更新