iOS 11 UISwipeActionsConfiguration滑动返回无法隐藏的问题咨询
解决UISwipeActionsConfiguration无法拖动隐藏滑动操作的问题
嘿,我之前也碰到过这个困扰!用UISwipeActionsConfiguration实现单元格尾部滑动后,没法像邮件App那样拖动回去隐藏操作,确实有点别扭。咱们来一步步排查解决:
1. 检查performsFirstActionWithFullSwipe配置
这个属性是控制全程左滑是否直接触发第一个操作的:
- 如果设为
true:全程左滑会直接执行第一个操作,不会停留在展开菜单的状态,自然没法拖动回去; - 如果设为
false:全程左滑只会展开操作菜单,这时候应该支持拖动回原位置关闭菜单。
你的代码里可以这样调整,确保把这个属性设对:
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let deleteAction = UIContextualAction(style: .destructive, title: "删除") { [weak self] action, view, completionHandler in // 执行删除逻辑 completionHandler(true) } let config = UISwipeActionsConfiguration(actions: [deleteAction]) // 关键:设为false,让全程左滑只展开菜单,不直接执行操作 config.performsFirstActionWithFullSwipe = false return config }
2. 排查自定义Cell的干扰
如果你的UITableViewCell是自定义的,检查这几个点:
- 有没有重写
setEditing:animated:?一定要调用super.setEditing(editing, animated: animated),否则会破坏系统的滑动状态管理; - 有没有添加自定义的手势识别器?如果有,确保这些手势不会和系统的滑动手势冲突。比如可以设置自定义手势的
requireGestureRecognizerToFail(_:),让系统的滑动手势优先触发:override func awakeFromNib() { super.awakeFromNib() // 假设你有一个自定义的tap手势 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap)) // 获取系统的滑动手势,让自定义手势在它失败后再触发 if let swipeGesture = tableView?.gestureRecognizers?.first(where: { $0 is UISwipeGestureRecognizer }) { tapGesture.requireGestureRecognizerToFail(swipeGesture) } addGestureRecognizer(tapGesture) } - 有没有修改
layoutSubviews里的布局逻辑?确保在编辑状态下,cell的子视图布局不会影响系统的滑动交互。
3. 确保TableView的交互状态正确
检查TableView的这几个属性:
allowsSelection:设为true(你已经提到点击单元格可以关闭,这个应该没问题,但还是确认下);allowsSelectionDuringEditing:如果你的TableView可能进入编辑状态,这个属性也要设为true,否则可能影响滑动后的交互。
4. 手动触发关闭(备选方案)
如果上面的方法都不行,还可以通过手动触发cell的编辑状态来关闭滑动菜单。比如监听cell的拖动手势,当拖动到一定阈值时,调用:
tableView.setEditing(false, animated: true)
不过这个是兜底方案,优先推荐前面的系统原生方法,因为更符合iOS的交互规范。
按照这些步骤排查下来,应该就能实现像邮件App那样拖动隐藏滑动操作的效果啦!
内容的提问来源于stack exchange,提问作者Oleksii Nezhyborets
相关产品推荐
相关产品推荐

