当 .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 错误,如果您遇到任何错误,请留下评论,因为很难列出所有错误。