UIPinchGestureRecognizer缩放方向异常,如何修正为iOS默认行为?
问题原因
SpriteKit 中相机的缩放逻辑和直观认知相反:
- 相机的
xScale/yScale值越大,场景内容显示得越小 - 相机的
xScale/yScale值越小,场景内容显示得越大
而UIPinchGestureRecognizer的scale属性:
- 手指分开时,
scale > 1 - 手指并拢时,
scale < 1
你直接用gesture.scale * accumulatedCameraScale计算新的相机缩放值,会导致逻辑完全反向:手指分开时相机scale变大,画面反而缩小;手指并拢时相机scale变小,画面反而放大。
修复方案
修改缩放值的计算逻辑,用累积缩放值除以手势scale,同时调整边界条件以匹配新的逻辑:
var normalCameraScale: CGFloat? var accumulatedCameraScale: CGFloat = 1.0 @objc func pinchZoom(_ gesture: UIPinchGestureRecognizer) { if self.normalCameraScale == nil { self.normalCameraScale = self.camera?.xScale ?? 1.0 self.accumulatedCameraScale = self.normalCameraScale! } let maxZoomLevel: CGFloat = 10.0 // 最大放大10倍 // 计算相机允许的最小缩放值(对应最大画面放大倍数) let minCameraScale = self.normalCameraScale! / maxZoomLevel // 用累积缩放值除以手势scale,实现正向逻辑 let newScale = self.accumulatedCameraScale / gesture.scale // 限制相机缩放值在合理范围:最小scale(最大放大)到初始scale(原始大小) if newScale >= minCameraScale && newScale <= self.normalCameraScale! { self.camera?.setScale(newScale) } if gesture.state == .ended { self.accumulatedCameraScale = self.camera?.xScale ?? 1.0 } }
关键修改点
- 将
newScale的计算从gesture.scale * accumulatedCameraScale改为accumulatedCameraScale / gesture.scale,反转缩放逻辑 - 新增
minCameraScale,对应画面最大放大倍数(这里是10倍),限制相机缩放值不能过小 - 调整边界判断条件为
newScale >= minCameraScale && newScale <= self.normalCameraScale!,确保画面只能在原始大小到最大放大倍数之间切换
内容的提问来源于stack exchange,提问作者West1
相关产品推荐
相关产品推荐

