You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    }
}

关键修改说明

  1. 新增dropCancelled(info:)方法:当系统取消拖拽操作(比如拖拽超出屏幕、用户主动取消拖拽)时,该方法会被触发,在这里将dragIn重置为false,恢复矩形的不透明度。
  2. 完善performDrop方法:拖拽完成后无论结果如何,都重置dragIn状态,避免拖拽结束后UI仍保持半透明状态。

内容的提问来源于stack exchange,提问作者test1229

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:35:23