捏手势不适用于 SKCameraNode

Posted

技术标签:

【中文标题】捏手势不适用于 SKCameraNode【英文标题】:Pinch Gesture Not Working with SKCameraNode 【发布时间】:2018-02-03 00:33:12 【问题描述】:

我正在使用带有 SKTileMapNode 和 SKCameraNode 的 SpriteKit 使用 Swift 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 的示例。我发现的示例要么我无法尝试从视图转换为相机,要么他们没有给出一个捏的例子。任何帮助将不胜感激!

【问题讨论】:

deltaScale初始化后为什么要设置3次? 这是我试图捕捉可以缩放的最小值和最大值的地方。这是我在网上搜索时发现的一种方法,不确定它是否有效。 【参考方案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

【讨论】:

以上是关于捏手势不适用于 SKCameraNode的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图平移防止捏手势?

捏手势IOS的手势绑定限制

在 Swift Playground 中捏手势?

手势不适用于包含 UITableViewControllers 的 UIPageViewController

为啥在捏缩放手势期间调用 setScaleX 会导致闪烁?

Nativescript 手势不适用于 vuejs