我尝试在本教程中实现CGButton
:
http://ganbarugames.com/2014/09/buttons-sprite-kit-using-swift/
我在一个简单的测试项目中试过这个,它运行得很好。 然后我把它放在我的工作项目中,发生了奇怪的事情。
当我点击按钮时,touchesBegan()
未被调用(我通过在其中添加println
来检查此项)。因此,不会触发该操作。但是,如果我在touchesBegan()
内的任何一行放置一个断点,那么这个断点就会被击中,touchesBegan()
可以在我继续之后工作。 (例如println()
此时打印出来)
我认为断点不会影响程序的流程。是什么导致这种情况,我该如何解决?
添加:
我在touchesBegan
和touchesEnded
时在按钮上添加了一些动画(开始时缩放到1.1并在结束时缩放到原始大小)。事实证明,当我点击按钮时,会触发touchesBegan
动画(缩放到1.1),但它只是停在那里,println
没有被击中。
答案 0 :(得分:1)
如果你想构建一个按钮或开关用于通用,你应该尝试我做的这个控件,使用它很直接: 您只需初始化所需的按钮/开关类型(ColoredSprite,Textured或TextOnly)
let control = TWButton(normalColor: SKColor.blueColor(), highlightedColor: SKColor.redColor(), size: CGSize(width: 160, height: 80))
初始化后,为它添加一个闭包(就像UIButton上的addTargetForSelector)
control.addClosureFor(.TouchUpInside, target: self, closure: { (scene, sender) -> () in
scene.testProperty = "Changed Property"
})
}
就是这样!有关GitHub页面上自述文件部分的更多信息:https://github.com/txaidw/TWControls
但是,如果您想在特定节点中实现,我就是这样做的:
internal override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let touchPoint = touch.locationInNode(self.parent)
if self.containsPoint(touchPoint) {
self.touchLocationLast = touchPoint
touchDown()
}
}
internal override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let touchPoint = touch.locationInNode(self.parent)
self.touchLocationLast = touchPoint
}
internal override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let touchPoint = touch.locationInNode(self.parent)
if let lastPoint = self.touchLocationLast where self.containsPoint(lastPoint) {
// Ended inside
touchUpInside()
}
else {
// Ended outside
touchUpOutside()
}
}
答案 1 :(得分:0)
谢谢你们帮助我。我的同事刚刚帮助我。
因此导致此问题的原因是,我的视图控制器中有一个水龙头和平移手势识别器,它们与我的touchesBegan
和touchesEnded
冲突。
因此,当我点击时,首先触发touchesBegan
。但是它会点击识别器而不是我的touchesEnded
。同样的事情,当我拖动时,它会转到平移识别器而不是touchesMoved