我想在没有uiscrollview的情况下滚动sprite kit中的节点
// 在touchesMoved中
let touch: UITouch = touches.first as! UITouch;
let location:CGPoint = touch.locationInNode(self);
let lastPosition = touch.previousLocationInNode(self)
var newLoc = selectNode.position.y + (location.y - lastPosition.y)
// Check if the top part is reached
if(newLoc < selectNodeStart){
newLoc = selectNodeStart
}
if(selectNode.position.y >= selectNodeStart){
// let sk = SKAction.moveToY(newLoc, duration: 0.1)
// selectNode.runAction(sk)
selectNode.position.y = newLoc
}
如果我使用 sk 动作,结果非常可怕,但没有结果也很可怕
答案 0 :(得分:1)
在SpriteKit中执行此操作的优雅方法是使用UIPanGestureRecognizer
来检测触摸,在其中您将创建一系列SKActions,以加速或减速运动。您可能必须使用update
方法和/或touches
来处理平移停止或另一个立即启动。不幸的是,如果你只想使用SpriteKit,你必须使用SKActions来实现它。
我认为我还会提到一种更简单(也可能更好看)的方法。看看“ScrollKit”,它运行得很好(虽然它确实使用了UIScrollView):https://github.com/bobmoff/ScrollKit
如果您发现UIScrollView没有通过touchesMoved
的触摸,您可以尝试一些不同的东西。
- 您可以添加UITapGestureRecognizer并在UIScrollView CanCancelContentTouches
上设置为YES
。
- 你可以继承UIScrollView并覆盖touchesMethods,这样如果用户没有滚动,触摸信息将被传递到响应者链:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent){
if (!self.dragging){
self.nextResponder.touchesBegan(touches , withEvent: event)
}
else{
super.touchesBegan(touches , withEvent: event)
}
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent){
if (!self.dragging){
self.nextResponder.touchesMoved(touches , withEvent:event)
}
else{
super.touchesMoved(touches , withEvent: event)
}
}
override func touchesEnded(touches: NSSet, withEvent: event UIEvent){
if (!self.dragging){
self.nextResponder.touchesEnded(touches , withEvent: event)
}
else{
super.touchesEnded(touches , withEvent: event)
}
}