如何解决SwiftUI - 拖放圆圈
我正在尝试创建可以拖放的圆圈。
我只能在第一个圆圈中使用它,但是,第一个圆圈之后的任何东西都不起作用。
预期行为:拖动时圆圈跟随我的光标,拖动结束时落在最终位置
实际行为:圆圈跟随我光标的水平位置,而不是垂直位置(垂直位置总是明显低于我的光标)
ContentView.swift
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(alignment: .center) {
ForEach(0..<5) { _ in
DraggableCircles()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct DraggableCircles: View {
@State var dragAmount: CGPoint = CGPoint.zero
var body: some View {
Circle().fill(Color.red)
.frame(width: 50,height: 50)
.gesture(
DragGesture(coordinateSpace: .global).onChanged {action in
let location = action.location
let newWidth = location.x
let newHeight = location.y
let size = CGPoint(x: newWidth,y: newHeight)
self.dragAmount = size
}.onEnded{action in
let location = action.location
let newWidth = location.x
let newHeight = location.y
let size = CGPoint(x: newWidth,y: newHeight)
self.dragAmount = size
}
)
.position(x: dragAmount.x,y: dragAmount.y)
}
}
解决方法
您必须将拖动值添加到最后一个位置。正确的计算在这里。
struct DraggableCircles: View {
@State private var location: CGPoint = CGPoint(x: 50,y: 50)
@GestureState private var startLocation: CGPoint? = nil
var body: some View {
// Here is create DragGesture and handel jump when you again start the dragging/
let dragGesture = DragGesture()
.onChanged { value in
var newLocation = startLocation ?? location
newLocation.x += value.translation.width
newLocation.y += value.translation.height
self.location = newLocation
}.updating($startLocation) { (value,startLocation,transaction) in
startLocation = startLocation ?? location
}
return Circle().fill(Color.red)
.frame(width: 50,height: 50)
.position(location)
.gesture(dragGesture)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。