希望有所启发。我有一段代码。哪个工作还可以。 我实现了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)
}
}
但是它仍然跳到我开始的任何捏合位置,而应该在各个捏合之间保持稳定,而不是重置。
我很欣赏我的代码过于简单,因此也欢迎提出更严格的代码建议。这是我第一次尝试同时使用手势。谢谢
答案 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作为全局变量。所以现在在结束状态下,我会返回*缩放比例,缩放比例现在仍然保持稳定。