首页 > 解决方案 > 快速同时手势和缩放捏手势

问题描述

希望得到一点启示。我有一段代码。哪个工作得很好。我实现了 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)


        }
    }

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

我很欣赏我的代码很简单,所以我也愿意接受更严格代码的建议。这是我第一次尝试同时使用手势。谢谢

标签: swiftsprite-kitgesture

解决方案


我终于明白,显然捏手势总是最初返回捏比例因子 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 作为全局变量。所以现在在状态结束时,我返回了 * 捏缩放比例,并且缩放比例现在保持完全稳定。


推荐阅读