为SKScene添加Mac触控板滚动手势:当前实现是否最优?
SKScene中滚动SKNode的优化实现方案
你当前通过在NSViewController中转滚轮事件到SKScene,再处理节点滚动的方案能正常运行,但可以进一步简化优化:
当前实现代码
NSViewController中的事件转发
override func scrollWheel(with event: NSEvent) { skView?.scene?.scrollWheel(with: event) super.scrollWheel(with: event) }
menuScene中的滚动逻辑
override func scrollWheel(with event: NSEvent) { scroller.position.x = scroller.position.x + (event.deltaX*3) }
更优的实现方式
1. 移除ViewController层的冗余转发
SKView本身会自动将滚轮事件传递给当前显示的SKScene,完全不需要在NSViewController中重写scrollWheel(with:)方法,直接删除这段代码即可。
2. 优化Scene中的滚动逻辑(可选)
如果需要更完善的滚动体验,可以加入边界限制或平滑动画,避免节点滚出可视区域,同时让滚动行为更自然:
override func scrollWheel(with event: NSEvent) { let scrollDelta = event.deltaX * 3 let targetX = scroller.position.x + scrollDelta // 限制scroller的滚动范围(示例:不超出场景左右边界) let minX = 0 let maxX = self.size.width - scroller.size.width let clampedTargetX = max(CGFloat(minX), min(targetX, CGFloat(maxX))) // 使用SKAction实现平滑滚动 scroller.run(SKAction.moveTo(x: clampedTargetX, duration: 0.1)) }
优化点说明
- 去掉冗余的事件转发层,代码更简洁,贴合SpriteKit原生的事件传递机制
- 避免手动转发可能引发的事件顺序错误、丢失等问题
- 可选的边界限制和动画能提升用户体验,让滚动行为更可控
内容的提问来源于stack exchange,提问作者Mateus
相关产品推荐
相关产品推荐

