SwiftUI EditMode下隐藏List汉堡图标且保留onMove拖拽功能的实现方法
SwiftUI EditMode下隐藏List重排汉堡图标方案
适配全系统版本方案(支持iOS13+)
通过调整行布局偏移把系统默认的重排图标挤出可视区域,再裁剪溢出内容,完全保留拖拽重排能力:
List { ForEach(items) { item in item.contextMenu { // 原有上下文菜单逻辑 } // 向左偏移30(覆盖默认重排图标宽度,可自行调整) .offset(x: -30) // 抵消偏移带来的右侧空白 .padding(.trailing, -30) } .onMove(perform: onMove) } .environment(\.editMode, $editMode) .listStyle(.plain) // 非必须,可保留你原有使用的List样式
该方案不需要调用moveDisabled,不会影响拖拽重排功能,重排手势响应区域和原有逻辑完全一致。
iOS16+原生方案
iOS16新增了重排控件显隐控制的原生修饰符,是最标准的实现方式:
List { ForEach(items) { item in item.contextMenu { // 原有上下文菜单逻辑 } .listRowReorderControl(.hidden) // 直接隐藏重排汉堡图标 } .onMove(perform: onMove) } .environment(\.editMode, $editMode)
注意事项
- 两个方案均完整保留
.onMove对应的拖拽重排功能,不需要修改原有重排逻辑 - 全系统方案的偏移量可以根据你的List行高、样式自行调整,只要确保重排图标被挤出可视区域即可
- 如果你的应用最低支持版本在iOS16及以上,优先选择原生修饰符方案,不需要额外适配布局
内容的提问来源于stack exchange,提问作者Ryan Hillis
相关产品推荐
相关产品推荐

