SwiftUI:如何根据已拖动的距离更改拖动速度?

Vla*_*noy 4 iphone ios swift swiftui

例如:我有一个可以自由移动的摇杆,如何让拖动速度随着距离变慢?操纵杆拖动得越远,拖动速度就越慢。\n提前致谢。

\n\n

我的操纵杆代码,拖动可以工作,但没有界限,并且如果将其拖动到边缘,则 \xe2\x80\x99t 速度会减慢:

\n\n
import SwiftUI\n\nstruct ContentView: View {\n\n    @State var isDragging = false\n    @State var dragValue = CGSize.zero\n\n    var body: some View {\n        VStack {\n            Text("width: \\(dragValue.width)")\n            Text("height: \\(dragValue.height)")\n            VStack (spacing: 16) {\n                HStack(spacing: 35) {\n                    Image(systemName: "chevron.left")\n                        .foregroundColor(.gray)\n\n\n                    VStack (spacing: 80) {\n                        Image(systemName: "chevron.up")\n                            .foregroundColor(.gray)\n                        Image(systemName: "chevron.down")\n                            .foregroundColor(.gray)\n\n                    }\n                    Image(systemName: "chevron.right")\n                        .foregroundColor(.gray)\n\n                }\n\n\n            }\n            .offset(x: dragValue.width * 0.05, y: dragValue.height * 0.05)\n\n            .frame(width: 150, height: 150)\n\n            .background(LinearGradient(gradient: Gradient(colors: [Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), Color(#colorLiteral(red: 0.8705882353, green: 0.8941176471, blue: 0.9450980392, alpha: 1))]), startPoint: .top, endPoint: .bottom))\n            .clipShape(RoundedRectangle(cornerRadius: isDragging ? (55 - abs(dragValue.height) / 10) : 55, style: .continuous))\n            .offset(x: dragValue.width, y: dragValue.height)\n\n            .shadow(color: Color.black.opacity(0.2), radius: 20, x: 0, y: 20)\n            .padding(.horizontal, 30)\n            .gesture(\n                DragGesture().onChanged { value in\n                    self.dragValue = value.translation\n                    self.isDragging = true\n                }\n                .onEnded { value in\n                    self.dragValue = .zero\n                    self.isDragging = false\n                }\n            )\n                .animation(.spring(response: 0.5, dampingFraction: 0.6, blendDuration: 0))\n        }\n\n    }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n    static var previews: some View {\n        ContentView()\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

Asp*_*eri 11

这是基于渐近曲线的可能解决方案(如果有人觉得有帮助)。

使用 Xcode 11.4 / iOS 13.4 进行测试

更新:使用 Xcode 13.4 / iOS 15.5 重新测试

演示

更改部分

DragGesture().onChanged { value in
    let limit: CGFloat = 200        // the less the faster resistance 
    let xOff = value.translation.width
    let yOff = value.translation.height
    let dist = sqrt(xOff*xOff + yOff*yOff);
    let factor = 1 / (dist / limit + 1)
    self.dragValue = CGSize(width: value.translation.width * factor,
                        height: value.translation.height * factor)
    self.isDragging = true
}
Run Code Online (Sandbox Code Playgroud)