SwiftUI:如何移除onMove拖动及长按列表项时的背景
解决SwiftUI列表拖动时的白色背景问题
要彻底移除列表项在长按拖动前后的白色背景,你需要覆盖系统默认的高亮样式,并确保所有状态下的背景都设为透明,具体修改如下:
- 禁用系统默认按钮高亮:给每个列表项添加
.buttonStyle(PlainButtonStyle()),消除长按触发拖动时的默认白色高亮。 - 自定义拖动预览背景:在
.onDrag的预览视图中明确设置透明背景,避免系统自动添加底色。 - 保持列表行背景透明:保留原有的
.listRowBackground(Color.clear)等透明化设置。
修改后的完整代码:
@State var items = ["item0", "item1", "item2"] var body: some View { List { ForEach(items, id: \.self) { item in ZStack { Rectangle() .frame(width: 150, height: 65) Text(item) } .buttonStyle(PlainButtonStyle()) // 移除系统默认高亮 .onDrag { NSItemProvider(object: item as NSString) } preview: { // 自定义拖动预览,确保背景透明 ZStack { Rectangle() .frame(width: 150, height: 65) Text(item) } .background(Color.clear) } .onMove { from, to in items.move(fromOffsets: from, toOffset: to) } } .listRowSeparator(.hidden) .listRowBackground(Color.clear) } .listStyle(.plain) .scrollContentBackground(.hidden) .environment(\.editMode, .constant(.active)) // 无需编辑按钮即可直接拖动排序 }
补充说明
.buttonStyle(PlainButtonStyle())会完全移除列表项的默认按压反馈,让自定义视图完全主导外观。- 若需要保留“点击编辑按钮激活拖动”的逻辑,可移除
.environment(\.editMode, .constant(.active)),并在视图中添加EditButton()组件。
内容的提问来源于stack exchange,提问作者Nicolas Gimelli
相关产品推荐
相关产品推荐

