swift - 快速同时手势和缩放捏手势
问题描述
希望得到一点启示。我有一段代码。哪个工作得很好。我实现了 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。显然!一旦我意识到这一点并且在 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 作为全局变量。所以现在在状态结束时,我返回了 * 捏缩放比例,并且缩放比例现在保持完全稳定。
推荐阅读
- javascript - 状态通过子组件中未定义的道具传递
- django - Python Django 防止密码重用
- sql - LEFT JOIN & SUM GROUP BY
- magento - Magento 命令在 ssh 终端上不起作用
- apache-beam - Apache Beam - 是否可以写入 Excel 文件?
- c# - 使用 SVG 标记生成新的 PDF
- bash - 使用 ssh 推送到 gitea 时询问密码
- css - 根据自定义值更改主题颜色
- c# - 如何将带有元音变音/特殊字符的 viewModel 字符串值传递给控制器操作
- thingsboard - ThingsBoard 安装失败