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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:35:45