捏手势不适用于SKCameraNode

时间:2018-02-03 00:33:12

标签: swift sprite-kit sktilemapnode skcameranode

我正在使用带有SKTileMapNode和SKCameraNode的SpriteKit与Swift 4合作。我希望能够使用相机平移/捏合/缩放平铺地图节点。我已经很好地进行了平移,但是我遇到了一些捏合/缩放的问题。

  1. 虽然我可以开始工作。每次发生另一次捏时,它会重置大小。所以例如,我会把它缩小然后再去捏一下,一触摸屏幕,它就会跳起来。它让我再次捏合放大/缩小,但不是基于我之前捏的尺寸。我想我可能需要存储调整大小并使用它但不确定如何。

  2. 我的捏缩放是相反的。当我捏放大时,它会缩小,反之亦然。

  3. 当我达到最小/最大比例限制时,它会停止进一步,但在达到极限时会断断续续。

  4. 这是我处理捏的功能:

    @objc func handlePinch(pinchGesture: UIPinchGestureRecognizer) {
    
          if pinchGesture.state == .began || pinchGesture.state == .changed {
    
              let currentScale: CGFloat = (camera?.xScale)!
              let minScale: CGFloat = 0.5
              let maxScale: CGFloat = 2.0
              let zoomSpeed: CGFloat = 0.5
              var deltaScale = pinchGesture.scale
    
              deltaScale = ((deltaScale - 1) * zoomSpeed) + 1
              deltaScale = min(deltaScale, maxScale / currentScale)
              deltaScale = max(deltaScale, minScale / currentScale)
    
              camera?.xScale = deltaScale
              camera?.yScale = deltaScale
          }
    }
    

    如果您有任何建议,请告诉我,因为我环顾了一堆,但我找不到人们使用SKCameraNode的示例。我发现的例子要么是我无法尝试从视图转换到相机,要么他们没有给出一个例子。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

虽然我可以开始工作。每次发生另一次捏时,它会重置大小。因此,例如,我将它缩小然后再次捏一下,一触摸屏幕,它就会跳起来。它让我再次捏合放大/缩小,但不是基于我之前捏的尺寸。我想我可能需要存储调整大小并使用它但不确定如何。

这是因为手势识别器在识别之间保留其属性。您可能希望在手势结束时重置scale。例如,您可以使用以下内容开始您的方法:

guard pinchGesture.state != .ended else {
    pinchGesture.scale = 0
    return
}
  

我的捏缩放是相反的。当我捏放大时,它会缩小,反之亦然。

来自SKCameraNode文档:

  

这样,相机的位置,比例和旋转始终会对场景的渲染方式产生相反的影响。例如,如果相机向右移动10个像素,则渲染场景,就好像其他所有内容都向左移动10个像素一样。同样,如果摄像机节点的xScaleyScale为2.0,那么渲染场景就像每个距离都是正常大小的一半一样,有效地增加了摄像机视口的可见区域。

我不确定你正在寻找什么样的效果,但你可能想尝试通过除以它来反转捏手势识别器的比例,例如:

var deltaScale = pinchGesture.scale / 1
camera?.xScale = deltaScale
camera?.yScale = deltaScale
  

当我达到最小/最大比例限制时,它会停止进一步,但在达到限制时会断断续续。

不确定没有看到具体的值,但这可能是由舍入问题引起的。如果您超出范围,可能需要避免触摸SKCameraNode。您可以尝试这样的方法:

var deltaScale = pinchGesture.scale / 1

guard deltaScale > minScale && deltaScale < maxScale else { return } 

camera?.xScale = deltaScale
camera?.yScale = deltaScale