长按时像iMessage一样突出显示UITableViewCell

时间:2019-02-11 10:03:48

标签: ios swift uitableview

我有一个使用Please select corresponding template.创建的简单聊天。我想添加长按后突出显示消息的功能。实际上,我想创建类似iMessage的功能:

长按后,我们取消突出显示背景(更暗),突出显示消息,滚动到该消息并显示UITableView

目前,我仅添加了actionSheetlongPress

actionSheet上按长按reongizer:

viewDidLoad

let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(onCellLongPressed(gesture:))) messagesTableView.addGestureRecognizer(longPressRecognizer) 功能:

onCellLongPressed

2 个答案:

答案 0 :(得分:1)

如您所见,背景颜色在导航栏上方,因此我猜想当用户选择一个单元格时,集合视图上方会巧妙地显示一个辅助视图控制器。

我认为这是两个不同的视图层次结构,看起来像一个:

  • 一个视图控制器包含气球列表
  • 一个视图控制器包含所选气球的副本以及一些关联的动作

这是路线图:

  1. 在收藏夹视图单元格中长按
  2. 复制所选的气球并将其显示在辅助视图控制器(ActionVC)
  3. 调整选定气球在ActionVC内的位置。如果选定的气球位于“将来的操作”按钮下,则应将其移动。如果所选的气球没有打扰任何人,则应在没有任何更改的情况下显示它。
  4. 调整集合视图的内容偏移以反映3。应在3旁边进行修改,以使其看起来像实际移动了单元格一样。
  5. 检测对ActionVC的任何触摸
  6. 关闭ActionVC

这里是example project

enter image description here

  • 要复制气球,实际上我创建了一个与集合视图单元格中使用的类相同的视图。但是您可以使用快照。
  • 要调整选定的气球在ActionVC中的位置,我优先使用约束。一个人说“别在动作按钮下面”,另一个人说“正好在单元格所在的位置”。我使用了简单的坐标转换来计算ActionVC中预期的选定气球位置。
  • 要同时执行3和4,我使用了ActionVC的transitionCoordinator,但是您可以使用一个简单的动画块来呈现不带动画的ActionVC。

答案 1 :(得分:0)

很抱歉,这个答案不能完全满足您的要求,但希望对您有所帮助。

您的初始代码正确,但是您尚未设置滚动类型。因此,我建议您使用此方法selectRow(at:animated:scrollPosition:)只需设置滚动位置:

self.messagesTableView.selectRow(at: indexPath, animated: true, scrollPosition: UITableViewScrollPosition.top)

这还将选择此行,因此调用以下方法tableView(_:didSelectRowAt:)。因此,您将需要在此处实现突出显示逻辑:

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// your logic of changing color
    }

然后,您应该执行类似的操作,但是要使用deselectRow(at:animated:)取消选择该行,我认为应该在用户完成操作后执行此操作。另外,您需要实现类似的功能tableView(_:didDeselectRowAt:)才能返回颜色:

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
// change color back
}

更新: 您也可以使用setHighlighted(_:animated:)方法突出显示单元格。这样,您可以避免使用selectRowAt / didSelectRowAt / didDeselectRowAt并使用

滚动tableView
tableView?.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true).