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)的主要内容,如果未能解决你的问题,请参考以下文章