gpt4 book ai didi

ios - 带有很多按钮的 VStack 上的 DragGesture,如何检测拖动何时在按钮内

转载 作者:行者123 更新时间:2023-11-29 11:25:58 24 4
gpt4 key购买 nike

在 UIKit 中,这可以通过如下代码完成:

if button.frame.contains(sender.location(in: rightStackView)) { ... }

但在 SwiftUI 中我似乎找不到任何类似于 frame.contains 的东西,那么我如何才能知道拖动何时在特定按钮或其他 View 内?

最佳答案

好吧,代码有点多,所以我尽可能地简化它只是为了演示可能的方法(没有框架重叠、拖动重定位、 float 拖动项目等)。此外,从问题中不清楚它将被使用什么。不管怎样,希望这个演示能以某种方式有用。

注意:使用 Xcode 11.2

这是结果

SwiftUI drag destination frame detection

这是一个带有预览提供程序的模块演示代码

import SwiftUI

struct DestinationDataKey: PreferenceKey {
typealias Value = [DestinationData]

static var defaultValue: [DestinationData] = []

static func reduce(value: inout [DestinationData], nextValue: () -> [DestinationData]) {
value.append(contentsOf: nextValue())
}
}

struct DestinationData: Equatable {
let destination: Int
let frame: CGRect
}

struct DestinationDataSetter: View {
let destination: Int

var body: some View {
GeometryReader { geometry in
Rectangle()
.fill(Color.clear)
.preference(key: DestinationDataKey.self,
value: [DestinationData(destination: self.destination, frame: geometry.frame(in: .global))])
}
}
}

struct DestinationView: View {
@Binding var active: Int
let label: String
let id: Int

var body: some View {
Button(action: {}, label: {
Text(label).padding(10).background(self.active == id ? Color.red : Color.green)
})
.background(DestinationDataSetter(destination: id))
}
}

struct TestDragging: View {
@State var active = 0
@State var destinations: [Int: CGRect] = [:]

var body: some View {
VStack {
Text("Drag From Here").padding().background(Color.yellow)
.gesture(DragGesture(minimumDistance: 0.1, coordinateSpace: .global)
.onChanged { value in
self.active = 0
for (id, frame) in self.destinations {
if frame.contains(value.location) {
self.active = id
}
}
}
.onEnded { value in
// do something on drop
self.active = 0
}
)
Divider()
DestinationView(active: $active, label: "Drag Over Me", id: 1)
}.onPreferenceChange(DestinationDataKey.self) { preferences in
for p in preferences {
self.destinations[p.destination] = p.frame
}
}
}
}

struct TestDragging_Previews: PreviewProvider {
static var previews: some View {
TestDragging()
}
}

关于ios - 带有很多按钮的 VStack 上的 DragGesture,如何检测拖动何时在按钮内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58900316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com