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
相关产品推荐
相关产品推荐

