iOS - 如何在精灵工具包中水平滚动

时间:2016-10-15 18:26:59

标签: ios swift xcode scroll sprite-kit

我有一个对于视图而言太大的SKSpriteNode,而我正在寻找Sprite Kit中的一种简单方法来水平滚动以便能够完全看到它。

谢谢!

image

2 个答案:

答案 0 :(得分:1)

你可以尝试使用SKCameraNode并回复像这样的平移手势:

// GameScene.swift
override func didMove(to view: SKView) {
    self.camera = SKCameraNode()

    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanFrom(recognizer:)))
    panGestureRecognizer.maximumNumberOfTouches = 1
    view.addGestureRecognizer(panGestureRecognizer)
}

func handlePanFrom(recognizer: UIPanGestureRecognizer) {
    if recognizer.state != .changed {
        return
    }

    // Get touch delta
    let translation = recognizer.translation(in: recognizer.view!)

    // Move camera
    self.camera?.position.x -= translation.x
    self.camera?.position.y += translation.y

    // Reset
    recognizer.setTranslation(CGPoint.zero, in: recognizer.view)
}

答案 1 :(得分:0)

获得简洁的类似滚动视图的UX的最简单方法是...使用滚动视图。在您的SKSceneView中嵌套一个:

Scene View
|-Scroll View

然后,您需要根据场景宽度和视口宽度设置contentSize的滚动视图。在这里,您应该根据场景的scaleMode和布局的其他特定功能进行一些相应的计算。

Raywenderlich提供了有关该主题的非常好的课程:
Scroll View School Part 13: Sprite Kit Integration
Scroll View School Part 14: Sprite Kit Level Selector
这些课程非常好,因为它们非常详细。他们会告诉您如何正确转换坐标。但是,有些东西并不理想:例如,您不需要向滚动视图添加内容视图,只需设置contentSize就可以了。另外,我建议使用SKCameraNode而不是将所有内容都放在根“ world”节点中。

此后,您必须收听滚动视图的delegate

// Example from one of my games
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let scrollWidth = scrollView.contentSize.width - scrollView.bounds.width
    guard scrollWidth > 0.01 else { return }
    let relativePosX = scrollView.contentOffset.x / scrollWidth

    // Feed relative position to the scene.
    // `setCameraRelativePosition` will convert it into the absolute camera
    // coordinates in the scene coordinate space
    gameScene.setCameraRelativePosition(relativePosX)
}

...并根据需要更新您的地图或相机位置。

UIPanGestureRecognizer永远不会像本地Scroll View那样减速和弹跳。