快速手势和缩放手势同时进行

时间:2020-01-27 13:24:35

标签: swift sprite-kit gesture

希望有所启发。我有一段代码。哪个工作还可以。 我实现了2种手势-捏和旋转。

let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:)))
view.addGestureRecognizer(pinchGesture)
pinchGesture.delegate = self
let rotateGesture = UIRotationGestureRecognizer(target: self, action: #selector(rotateAction(sender:)))
view.addGestureRecognizer(rotateGesture)
rotateGesture.delegate = self

然后是我在另一个线程上找到的此功能。

   func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        if (gestureRecognizer is UIPanGestureRecognizer || gestureRecognizer is UIRotationGestureRecognizer) {
            return true
        } else {
            return false
        }
    }

我的班级设置为

class GameScene: SKScene, UIGestureRecognizerDelegate {

所以我的第一个问题是。实际上如何调用此函数?是否因为被称为gestureRecognizer而自动调用?我没有在代码中将其作为函数调用。抱歉,发现它令人困惑。

另一个有趣的问题是,当我使用收缩功能重新缩放我的SKSprite节点时,我希望它不跳回初始收缩的比例。我已经为要调整的节点的比例设置了一个变量,并在收紧开始时进行了调整,并在收紧结束时也进行了调整:

 @objc func pinchAction(sender:UIPinchGestureRecognizer){
        if sender.state == .began{
            //print("Pinch Began")
            pointer.setScale(CGFloat(protractorScale * 0.5))
            protractor.setScale(CGFloat(protractorScale * 0.45))

        }
        if sender.state == .changed{
           // print("Pinch Change")
            let newScale = sender.scale
            protractorScale = Double(newScale)
            print(newScale)
            pointer.setScale(CGFloat(protractorScale * 0.5))
            protractor.setScale(CGFloat(protractorScale * 0.45))
            ballSpeed = Float(newScale * 500)
        }
        if sender.state == .ended{
           // print("Pinch Ended")

            let newScale = sender.scale
                       protractorScale = Double(newScale)


        }
    }

但是它仍然跳到我开始的任何捏合位置,而应该在各个捏合之间保持稳定,而不是重置。

我很欣赏我的代码过于简单,因此也欢迎提出更严格的代码建议。这是我第一次尝试同时使用手势。谢谢

1 个答案:

答案 0 :(得分:0)

我终于明白,明显地,捏手势最初总是返回捏比例因子1。显然!一旦我意识到这一点,并且在KnightOfDragon的建议下,它就很简单。

   @objc func pinchAction(sender:UIPinchGestureRecognizer){
        if sender.state == .began{

            let startScale = sender.scale
            print("initial pinch scale \(startScale)")

            pointer.setScale(CGFloat(protractorScale))
            protractor.setScale(CGFloat(protractorScale))

        }
        if sender.state == .changed{

            let getScale = sender.scale
            print(getScale)

            let newScale = (CGFloat(protractorScale) * getScale)
            pointer.setScale(newScale)
            protractor.setScale(newScale)
            ballSpeed = Float(newScale * 100)

            ballSpeedIndicator.text = "\(Int(ballSpeed))"

        }
        if sender.state == .ended{
            // print("Pinch Ended")

            let newScale = sender.scale
            protractorScale = protractorScale * Double(newScale)


        }
    }

我将初始节点比例也设置为1作为全局变量。所以现在在结束状态下,我会返回*缩放比例,缩放比例现在仍然保持稳定。