SwiftUI旋转表盘二次拖拽不流畅问题求助
SwiftUI拖拽旋转表盘二次卡顿问题修复
你的问题出在拖拽手势的角度计算逻辑上:当前代码使用translation(拖拽偏移量)计算绝对角度,导致二次拖拽时,表盘会从基于新拖拽点的角度重新开始,而非从上次旋转结束的位置继续,这就造成了卡顿跳变。
修复方案
核心思路是记录上次旋转的最终角度,每次拖拽时计算相对于起始拖拽点的角度偏移,再累加到上次角度上,而非直接用偏移量计算绝对角度。
修改后的代码示例
struct LockerView: View { @State private var rotationAngle: Double = 0.0 @State private var lastRotationAngle: Double = 0.0 // 记录上次拖拽结束后的角度 // ... 其他代码省略 private var CircleWithNumber: some View { GeometryReader { geo in let viewCenter = CGPoint(x: geo.size.width/2, y: geo.size.height/2) let gesture = DragGesture() .onChanged { value in // 计算拖拽起始点相对于视图中心的初始角度 let startVector = CGVector(dx: value.startLocation.x - viewCenter.x, dy: value.startLocation.y - viewCenter.y) let startRadians = atan2(startVector.dy, startVector.dx) let startAngle = startRadians * 180 / .pi // 计算当前拖拽点相对于视图中心的角度 let currentVector = CGVector(dx: value.location.x - viewCenter.x, dy: value.location.y - viewCenter.y) let currentRadians = atan2(currentVector.dy, currentVector.dx) let currentAngle = currentRadians * 180 / .pi // 计算角度偏移,累加到上次旋转角度上 let offsetAngle = currentAngle - startAngle rotationAngle = lastRotationAngle + offsetAngle } .onEnded { _ in // 拖拽结束时更新上次旋转角度 lastRotationAngle = rotationAngle } return ZStack { InnerCircle Numbers } .rotationEffect(.degrees(rotationAngle)) .gesture(gesture) } } }
关键修复点
- 新增
lastRotationAngle变量,保存每次拖拽结束后的最终旋转角度 - 使用
GeometryReader获取视图自身的中心坐标,替代屏幕中心,适配不同布局场景 - 计算拖拽起始点与当前点的角度差,作为偏移量累加到已有角度上,保证旋转的连贯性
- 拖拽结束时更新
lastRotationAngle,确保下次拖拽从当前位置继续旋转
内容的提问来源于stack exchange,提问作者Kishan Bhatiya
相关产品推荐
相关产品推荐

