SpriteKit场景按钮缩放出现inf/-inf异常 数学逻辑问题求解
SpriteKit缩放功能bug修复方案
错误原因
你两个版本的代码核心问题都出在缩放逻辑的数学计算上:
- 第一个版本中
count初始值为0,当你多次点击缩小按钮后count会回到0,此时做除法运算previousCameraScale / CGFloat(count)就会出现无穷值,这就是你看到inf/-inf的直接原因 - 第二个版本的缩放逻辑完全错误,把
count叠加值直接和当前scale做加减,没有边界限制,操作次数多了之后值会完全失控,且和捏合手势的缩放逻辑不统一,两个操作会互相干扰
修复后代码
不需要维护额外的count变量,直接固定缩放步长,加上边界限制即可:
// 缩放参数配置,可根据业务需求调整 private let minScale: CGFloat = 0.3 // 最大放大比例(scale越小画面越大) private let maxScale: CGFloat = 2.5 // 最大缩小比例(scale越大画面越小) private let zoomStep: CGFloat = 0.2 // 每次按钮点击的缩放幅度 private var previousCameraScale: CGFloat = 1.0 // 捏合缩放逻辑,增加边界限制 @objc func pinchGestureAction(_ sender: UIPinchGestureRecognizer) { guard let camera = cadScene.camera else { return } if sender.state == .began { previousCameraScale = camera.xScale } let targetScale = previousCameraScale / sender.scale // 限制缩放范围,避免超出合理值 let validScale = min(max(targetScale, minScale), maxScale) camera.setScale(validScale) } // 放大按钮 @IBAction func zoomIn(_ sender: Any) { guard let camera = cadScene.camera else { return } let targetScale = camera.xScale - zoomStep let validScale = min(max(targetScale, minScale), maxScale) camera.setScale(validScale) } // 缩小按钮 @IBAction func zoomOut(_ sender: Any) { guard let camera = cadScene.camera else { return } let targetScale = camera.xScale + zoomStep let validScale = min(max(targetScale, minScale), maxScale) camera.setScale(validScale) }
逻辑说明
- SpriteKit的Camera节点缩放规则:scale值越小,画面放大效果越强;scale值越大,画面缩小效果越强,所以放大操作减小scale,缩小操作增大scale
- 边界限制会把缩放值始终控制在你设置的合理区间内,不会出现0、负数等异常值,自然不会触发无穷值报错
- 按钮缩放直接基于当前Camera的实时scale调整,不需要额外计数,避免计数错误导致的逻辑问题
- 捏合手势和按钮缩放共用同一套边界规则,两个操作不会互相冲突
内容的提问来源于stack exchange,提问作者narner
相关产品推荐
相关产品推荐

