You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:15:21