使用触摸滚动SpriteNode

时间:2015-09-07 12:59:07

标签: ios swift uiscrollview sprite-kit

我想在没有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 动作,结果非常可怕,但没有结果也很可怕

1 个答案:

答案 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)
    }    
}