SwiftUI-在视图上拖动和释放时如何获得通知
我的屏幕上有两个圆圈(顶部和底部)。我希望用户按下顶部圆圈,然后拖动到底部圆圈 我没有拖拽(我不希望UI改变) 我只想知道,用户是从最上面的开始,然后将手指放在最下面的圆圈上。当用户将手指放在底部时 我无法从其他问题中找到答案 现行代码 截图SwiftUI-在视图上拖动和释放时如何获得通知,swiftui,Swiftui,我的屏幕上有两个圆圈(顶部和底部)。我希望用户按下顶部圆圈,然后拖动到底部圆圈 我没有拖拽(我不希望UI改变) 我只想知道,用户是从最上面的开始,然后将手指放在最下面的圆圈上。当用户将手指放在底部时 我无法从其他问题中找到答案 现行代码 截图 非常感谢您的帮助 在这里,我可以找到一种方法来通知这两个圆圈是否在彼此的内部: 现在还不清楚你想要达到什么目的,也许你可以添加更多关于你正在尝试的信息或gif。比起你@swiftPunk,我已经更新了我的问题,希望能更清楚!所以我认为正确的提问方式
非常感谢您的帮助 在这里,我可以找到一种方法来通知这两个圆圈是否在彼此的内部:
现在还不清楚你想要达到什么目的,也许你可以添加更多关于你正在尝试的信息或gif。比起你@swiftPunk,我已经更新了我的问题,希望能更清楚!所以我认为正确的提问方式应该是:你想得到通知,如果蓝色圆圈被拖拽并在绿色圆圈上释放,对吗?否则你就不想收到关于它的通知谢谢。对不起,我的解释不是很好。我同意并更新了标题,以反映没有构建it功能,形状或对象可以意识到自己或其他人处于同一位置,我们应该以自定义方式创建,是吗?嘿@swiftPunk,谢谢你回答这个问题,非常感谢。我理解这种方法,而且效果很好!
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Circle()
.fill()
.foregroundColor(.blue)
.frame(width: 100, height: 100)
.gesture(
DragGesture(minimumDistance: 0, coordinateSpace: .named("mySpace"))
.onChanged { value in
}
.onEnded { value in
// if value.location == endPoint {
// print("user started press on blue and ended on green")
// }
}
)
Spacer()
Circle()
.fill()
.foregroundColor(.green)
.frame(width: 100, height: 100)
}.coordinateSpace(name: "mySpace")
}
}
import SwiftUI
struct ContentView: View {
typealias OffsetType = (offset: CGSize, lastOffset: CGSize)
@State private var objects: [OffsetType] = [(offset: CGSize(width: 0.0, height: -200.0), lastOffset: CGSize(width: 0.0, height: -200.0)),
(offset: CGSize(width: 0.0, height: 200.0), lastOffset: CGSize(width: 0.0, height: 200.0))]
var body: some View {
ZStack {
CircleView(color: Color.blue)
.offset(objects[0].offset)
.gesture(dragGesture(indexOfObject: 0))
CircleView(color: Color.green)
.offset(objects[1].offset)
.gesture(dragGesture(indexOfObject: 1))
}
.animation(Animation.easeInOut(duration: 0.1))
}
func dragGesture(indexOfObject: Int) -> some Gesture {
DragGesture(minimumDistance: 0.0, coordinateSpace: .global)
.onChanged() { value in
objects[indexOfObject].offset = CGSize(width: objects[indexOfObject].lastOffset.width + value.translation.width,
height: objects[indexOfObject].lastOffset.height + value.translation.height)
}
.onEnded() { value in
objects[indexOfObject].lastOffset = CGSize(width: objects[indexOfObject].lastOffset.width + value.translation.width,
height: objects[indexOfObject].lastOffset.height + value.translation.height)
objects[indexOfObject].offset = objects[indexOfObject].lastOffset
distance()
}
}
func distance() {
if pow(pow((objects[1].offset.width - objects[0].offset.width), 2.0) + pow((objects[1].offset.height - objects[0].offset.height), 2.0), 0.5) <= 100 { print("same place!") }
}
}
struct CircleView: View {
let color: Color
var body: some View {
Circle()
.fill(color)
.frame(width: 100, height: 100)
}
}