Vla*_*noy 4 iphone ios swift swiftui
例如:我有一个可以自由移动的摇杆,如何让拖动速度随着距离变慢?操纵杆拖动得越远,拖动速度就越慢。\n提前致谢。
\n\n我的操纵杆代码,拖动可以工作,但没有界限,并且如果将其拖动到边缘,则 \xe2\x80\x99t 速度会减慢:
\n\nimport 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\nRun Code Online (Sandbox Code Playgroud)\n
Asp*_*eri 11
这是基于渐近曲线的可能解决方案(如果有人觉得有帮助)。
使用 Xcode 11.4 / iOS 13.4 进行测试
更改部分
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)
| 归档时间: |
|
| 查看次数: |
1639 次 |
| 最近记录: |