SwiftUI拖放时拖拽出屏幕左侧未触发dropExited的问题
解决SwiftUI拖拽到屏幕边缘时DropDelegate未触发dropExited的问题
问题核心是:当拖拽操作被系统主动取消(比如拖拽移出屏幕边缘),dropExited方法不会被触发,只有拖拽离开drop区域但仍在应用内时该方法才会执行。要修复这个问题,需要监听拖拽取消的事件来重置UI状态。
修改后的完整代码
import SwiftUI struct ContentView: View { @State private var dragIn = false var body: some View { VStack { Rectangle() .foregroundColor(.gray) .opacity(dragIn ? 0.5 : 1) } .onDrop(of: [.image], delegate: DropController(dragIn: $dragIn)) } } class DropController: DropDelegate{ @Binding var dragIn: Bool init(dragIn: Binding<Bool>) { _dragIn = dragIn } func dropExited(info: DropInfo) { dragIn = false print("out") } // 添加拖拽取消时的处理逻辑 func dropCancelled(info: DropInfo) { dragIn = false print("cancelled") } func dropUpdated(info: DropInfo) -> DropProposal? { dragIn = true print("dragging") return nil } func performDrop(info: DropInfo) -> Bool { // 拖拽完成后重置状态 dragIn = false print("dropped") return true } }
关键修改说明
- 新增
dropCancelled(info:)方法:当系统取消拖拽操作(比如拖拽超出屏幕、用户主动取消拖拽)时,该方法会被触发,在这里将dragIn重置为false,恢复矩形的不透明度。 - 完善
performDrop方法:拖拽完成后无论结果如何,都重置dragIn状态,避免拖拽结束后UI仍保持半透明状态。
内容的提问来源于stack exchange,提问作者test1229
相关产品推荐
相关产品推荐

