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

SwiftUI中使用.onDrag与.onDrop拖拽排序HStack后出现界面延迟

HStack元素拖拽重排后界面延迟问题

我采用相关方案实现HStack内元素的拖拽重排,功能可正常运行,但拖放完成后界面会出现明显延迟。测试环境为M2芯片+macOS Sonoma 14.2.1。

以下是可复现问题的示例代码:

import SwiftUI
import UniformTypeIdentifiers

struct TTab: Identifiable, Equatable {
    let id = UUID()
    let name: String
}

struct ContentView: View {
    
    @State var tabs = [TTab(name: "Tab 1"), TTab(name: "Tab 2"), TTab(name: "Tab 3")]
    @State var draggingTab: TTab? = nil
        
    var body: some View {
        VStack {            
            HStack(spacing: 10) {
                ForEach(self.tabs) { tab in
                    Text(tab.name)
                        .onDrag {
                            self.draggingTab = tab
                            return NSItemProvider(object: "\(tab.id)" as NSString)
                        }
                        .onDrop(of: [UTType.text],
                                delegate: DragRelocateDelegate(dragging: self.$draggingTab,
                                                               current: tab,
                                                               tabs: self.$tabs))
                }
            }
        }
        .padding()
    }
}


#Preview {
    ContentView()
}

struct DragRelocateDelegate: DropDelegate {
    
    @Binding var dragging: TTab?
    var current: TTab
    @Binding var tabs: [TTab]
    
    func dropEntered(info: DropInfo) {
        if self.dragging != self.current {
            let from = self.tabs.firstIndex(where: { $0.id == self.dragging!.id })!
            let to = self.tabs.firstIndex(where: { $0.id == self.current.id })!
            if self.tabs[from].id != self.current.id {
                self.tabs.move(fromOffsets: IndexSet(integer: from), toOffset: to > from ? to + 1 : to)
            }
        }
    }
    
    func dropUpdated(info: DropInfo) -> DropProposal? {
        return DropProposal(operation: .move)
    }
    
    func performDrop(info: DropInfo) -> Bool {
        self.dragging = nil
        return true
    }
}

补充测试细节:

  • 在performDrop方法中添加print("finished"),控制台输出无延迟,说明方法执行正常,但界面仍卡顿
  • 释放鼠标后,拖拽元素会停留约1秒才归位

请问这是什么原因?是否属于SwiftUI的Bug?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:21:08