当 .onDrag 在 SwiftUI 中离开视图边界时关闭视图
Close View when .onDrag leaves view boundaries in SwiftUI
我想在拖动项目时手指越过视图边界时立即关闭对象菜单。注意:我不想在放下物品时关闭物品。不幸的是,我不知道如何实现这一目标。
我只是在使用:
struct BuildingItemSlot: View {
var preview: ObjectPreview
var body: some View {
VStack() {
Image(uiImage: UIImage(contentsOfFile: preview.dataPath + "/Raw/Thumbnails/" + preview.id + ".png") ?? UIImage())
.resizable()
//.scaledToFit()
.frame(width: 64, height: 64)
.padding(4)
//.border(Color.black, width: 1)
}
.onDrag({ NSItemProvider() })
}
}
嵌入构成清单的视图中...
VStack() {
ForEach(networkManager.objectPreviewList.objects ?? []){ preview in
BuildingItemSlot(preview: preview)
}
}
.padding(40)
我只是通过以下方式打开和关闭侧边菜单:
.offset(x: stateHandler.openBuildingsMenu ? 0 : 480)
非常感谢,
雅各布
方法:
- 使用
onDrop(of:delegate)
是要在可以接受放置的视图上使用的视图修饰符。
- DropDelegate 具有如下功能
dropEntered
,
dropExited
,
dropUpdated
,
validateDrop
- 你可以动态验证drop是否有效
performDrop
- 通过添加打印语句来尝试上述功能
中断:
- 无法中断拖动手势,但是
validateDrop
应该让您控制何时接受/拒绝动态拖放。
参考:
Mac
iOS
注:
- macOS 和 iOS 的拖放存在一些 SwiftUI 错误,如果您遇到任何错误,请留下评论,因为很难列出所有错误。
我想在拖动项目时手指越过视图边界时立即关闭对象菜单。注意:我不想在放下物品时关闭物品。不幸的是,我不知道如何实现这一目标。
我只是在使用:
struct BuildingItemSlot: View {
var preview: ObjectPreview
var body: some View {
VStack() {
Image(uiImage: UIImage(contentsOfFile: preview.dataPath + "/Raw/Thumbnails/" + preview.id + ".png") ?? UIImage())
.resizable()
//.scaledToFit()
.frame(width: 64, height: 64)
.padding(4)
//.border(Color.black, width: 1)
}
.onDrag({ NSItemProvider() })
}
}
嵌入构成清单的视图中...
VStack() {
ForEach(networkManager.objectPreviewList.objects ?? []){ preview in
BuildingItemSlot(preview: preview)
}
}
.padding(40)
我只是通过以下方式打开和关闭侧边菜单:
.offset(x: stateHandler.openBuildingsMenu ? 0 : 480)
非常感谢, 雅各布
方法:
- 使用
onDrop(of:delegate)
是要在可以接受放置的视图上使用的视图修饰符。 - DropDelegate 具有如下功能
dropEntered
,dropExited
,dropUpdated
,validateDrop
- 你可以动态验证drop是否有效performDrop
- 通过添加打印语句来尝试上述功能
中断:
- 无法中断拖动手势,但是
validateDrop
应该让您控制何时接受/拒绝动态拖放。
参考:
Mac
iOS
注:
- macOS 和 iOS 的拖放存在一些 SwiftUI 错误,如果您遇到任何错误,请留下评论,因为很难列出所有错误。