【问题标题】:LongPressHold Switch Not Evaluating to Ended/Failed (Drop & Drop Freeze)LongPressHold 开关未评估为结束/失败(Drop and Drop Freeze)
【发布时间】:2017-01-05 18:05:45
【问题描述】:

我有一个 UITableView,我添加了一个 UILongPressGestureRecognizer。当一个单元格被按住时,它会触发一个评估手势状态的开关:

switch state { 
    case UIGestureRecognizerState.began:
        //Takes a snapshot of the cell, shows image and hides cell
        print("User held cell.")
    case UIGestureRecognizerState.changed:
        //Runs when cell-snapshot is dragged 
        print("LocationInView is: \(location)")
    default:
        //Runs when the user "lets go" of the cell
        print("User let go.")
 }

在测试期间,如果将单元格拖到表格上方或下方并松开,则会冻结。如果拖回来越过桌子放开,没关系。

表格不会占据整个屏幕,如果用户试图将其拖出表格边界,则单元格会停在表格的边缘。当您在“越界”时放手时,单元格将永久冻结在边缘。

如果开关告诉我手势完成,我可以简单地隐藏单元格,但问题是默认设置永远不会触发。如果用户在离开桌子后抬起手指,则开关永远不会评估为默认值。

现在 UIGestureRecognizerState 有“cancelled”、“ended”和“failed”状态,为什么它们不触发默认状态?我有打印语句来显示正常的手指抬起:

然后在桌子区域外抬起手指:

【问题讨论】:

    标签: ios swift uitableview uigesturerecognizer


    【解决方案1】:

    这个问题的答案在代码中并不明显,但在图像中。单元格被拖出“边界”,或被拖出表格/到其边缘。一旦到达那里,它就无法传递要评估的 indexValue!

    这是解决方案,因为大多数 tableView 拖放代码会首先检查 nil,包括我自己的:

        if indexPath != nil {
            switch state {
            case UIGestureRecognizerState.began:
                ...
    

    棘手的部分是如何处理现在您无法评估识别器状态的情况......它是否结束/失败/取消?如果我要重新开始,我会尝试将识别器添加到全屏视图中,这样无论用户的手指走到哪里,我都可以始终监控手势识别器状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-18
      • 2010-12-27
      • 2011-02-08
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多