基本上我需要在我的 SpriteKit 项目中创建一个 UIScrollView 但是我在添加 SKButtons(用于按钮管理的自定义 SKNode 类)时遇到了很多问题。所以我继续创建一个带有触摸手势的可滚动 SKNode,但很明显,这个栏不会有原生的 UIScrollView 加速:我正在寻找的功能。

所以试图通过添加一个原生 UIScrollView 来解决这个问题,并捕捉每一个位置的变化,像这样:

使用此代码:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [blueNode setPosition:CGPointMake(blueNode.position.x, scrollerUI.contentOffset)];
}

这是正确的,但愚蠢的是我忘记了如果我添加按钮,触摸手势将无法识别按钮的触摸事件! (UIScrollView 有优先权)。

也许只是一个愚蠢的问题,但我真的不知道如何弄清楚。也许编写我自己的加速方法?

最佳答案

我想我想出了一个处理触摸的解决方案。由于 UIScrollView 吃掉所有触摸以允许它滚动,因此您需要将它们传递给 SKScene 。您可以通过子类化 UIScrollView 来做到这一点:

class SpriteScrollView: UIScrollView {

    var scene: SKScene?


    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        scene?.touchesBegan(touches, withEvent: event)
    }

    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        scene?.touchesMoved(touches, withEvent: event)
    }

    override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
        scene?.touchesCancelled(touches, withEvent: event)
    }

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
        scene?.touchesEnded(touches, withEvent: event)
    }
}

然后您的场景需要查看触摸是否击中任何节点并将触摸适本地发送到这些节点。所以在你的 SKScene 中添加:
var nodesTouched: [AnyObject] = []

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    super.touchesBegan(touches, withEvent: event)

    let location = (touches.first as! UITouch).locationInNode(self)
    nodesTouched = nodesAtPoint(location)

    for node in nodesTouched as! [SKNode] {
        node.touchesBegan(touches, withEvent: event)
    }
}

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    super.touchesMoved(touches, withEvent: event)

    for node in nodesTouched as! [SKNode] {
        node.touchesMoved(touches, withEvent: event)
    }
}

override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
    super.touchesCancelled(touches, withEvent: event)
    for node in nodesTouched as! [SKNode] {
        node.touchesCancelled(touches, withEvent: event)
    }
}

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    super.touchesEnded(touches, withEvent: event)
    for node in nodesTouched as! [SKNode] {
        node.touchesEnded(touches, withEvent: event)
    }
}

请注意,这是针对单次触摸并且不能很好地处理错误,如果您想正确执行此操作,则需要将一些强制向下转换包装在 if 语句中

我希望这对某人有所帮助,即使这个问题已有数月之久。

关于ios - 带加速功能的 SpriteKit 自定义 UIScrollView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27488393/

10-12 00:10
查看更多