LongPressHold 开关未评估为结束/失败(Drop and Drop Freeze)

Posted

技术标签:

【中文标题】LongPressHold 开关未评估为结束/失败(Drop and Drop Freeze)【英文标题】:LongPressHold Switch Not Evaluating to Ended/Failed (Drop & 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”状态,为什么它们不触发默认状态?我有打印语句来显示正常的手指抬起:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于LongPressHold 开关未评估为结束/失败(Drop and Drop Freeze)的主要内容,如果未能解决你的问题,请参考以下文章

评估失败,因为线程未挂起

ASP.NET Core使用功能开关控制路由访问(续)

为啥在 bash if 语句中未设置的变量被评估为 0

我在oracle数据库里批量添加数据失败 报SQL命令未正确结束 但是单条数据可以添加成功代码如下:

C# 布尔评估未按预期进行评估

如何检测新值已添加到枚举中并且未在开关中处理