我已经以一种非常香草的方式实现了三指平移手势:
override func viewDidLoad() {
super.viewDidLoad()
let triplePanRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleTriplePan(recognizer:)))
triplePanRecognizer.delegate = self
triplePanRecognizer.isEnabled = true
triplePanRecognizer.minimumNumberOfTouches = 3
tableView.addGestureRecognizer(triplePanRecognizer)
}
@objc func handleTriplePan(recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .began:
print("triple pan began")
tableView.isScrollEnabled = false // You may wanna add this for convenience.
case .changed:
print("triple pan changed")
case .ended:
print("triple pan ended")
tableView.isScrollEnabled = true
case .cancelled:
print("triple pan cancelled")
tableView.isScrollEnabled = true
}
}
现在,在执行三次平移后,在下一行选择中,didSelectRowAt(indexPath :)将返回错误的行,实际上,它不返回所选的行,而是 以前的三重锅开始了 :
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("indexPath: \(indexPath.row)")
}
有没有办法规避这种行为?
编辑:现在,我已经在一个新的项目表单中对它进行了测试,一切正常。这一定是我项目中的错误,长按识别器也会发生。
编辑2:我可以通过以下方式解决此问题: 我的表格视图单元格也使用3d触摸,这就是为什么我的单元格使用touchesMoved和touchesEnded实现的原因。由于某些原因,touchesCancelled的实现是导致选择行为的原因。奇怪的是,即使此方法为空实现也会触发此问题。我能够删除该方法,现在平移/长按手势后的选择符合预期。
编辑3:事实证明,这是整个行为的发生,因为我没有在touchesCancelled内调用super.touchesCancelled ...