按比例缩放 UIPanGesture 操作以缩放 SpriteKit 场景中的级别

Proportionally scaling UIPanGesture actions to zoom level in a SpriteKit scene

我的 iOS 应用程序中有一个 SpriteKit 场景,它同时使用平移和捏合手势 - 平移用于移动场景相机的视图,捏合手势用于放大和缩小场景通过缩放场景的相机。

缩放效果很好:

@objc func pinchGestureAction(_ sender: UIPinchGestureRecognizer) {

    guard let camera = canvasScene.camera else {
        return
    }

    if sender.state == .began {
        previousCameraScale = camera.xScale
    } else if sender.state == .ended {
        previousCameraScale = camera.xScale
        return
    }

    camera.setScale(previousCameraScale * 1 / sender.scale)

    print(camera.xScale)
    print(camera.yScale)
}

问题在于平移,这是使用平移手势识别器完成的:

@objc func panGestureAction(_ sender: UIPanGestureRecognizer) {

    if sender.state != .changed {
       return
    }

    guard let camera = canvasScene.camera else {
       return
    }

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

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

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

当用户放大到非常靠近 canvas 上的对象时,平移效果很好。当相机进一步缩小时,平移 canvas 场景所需的手势比在近距离放大相机视图时需要大量手势。

我尝试通过相机的缩放因子缩放相机位置的值,如下所示:

self.canvasScene.camera?.position.x -= translation.x * camera.xScale
self.canvasScene.camera?.position.y += translation.y * camera.yScale

但这似乎不起作用。关于如何根据相机放大到场景的距离最好地实现正确的相机平移行为有什么想法吗?

为了获得所需的行为,我必须对 SKScene 的相机位置应用一个额外的比例因子:

@objc func panGestureAction(_ sender: UIPanGestureRecognizer) {
    if sender.state != .changed {
        return
    }
    
    guard let camera = canvasScene.camera else {
        return
    }
    
    // Get touch delta
    let translation = sender.translation(in: sender.view!)
    
    // Move camera
    self.canvasScene.camera?.position.x -= translation.x * camera.xScale / 1.5
    self.canvasScene.camera?.position.y += translation.y * camera.yScale / 1.5
    
    // Reset
    sender.setTranslation(CGPoint.zero, in: sender.view)
}