与 UITapGestureRecognizer 一起使用时未调用 collectionView 的 didSelectItemAt
Posted
技术标签:
【中文标题】与 UITapGestureRecognizer 一起使用时未调用 collectionView 的 didSelectItemAt【英文标题】:collectionView's didSelectItemAt not called when use it with UITapGestureRecognizer 【发布时间】:2017-09-19 17:36:48 【问题描述】:一旦我使用 addGestureRecognizer 关闭 scrollView 中的键盘,collectionView 的 didSelectItemAt 将不起作用。有什么建议吗?
更新代码:目前我可以点击关闭键盘并点击对收集单元格进行操作。但是,如果我滑动滚动视图,键盘将关闭。有什么办法可以防止吗?
class PostVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate
@IBOutlet weak var colorCollectionView: UICollectionView!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var titleTextField: UITextField!
override func viewDidLoad()
super.viewDidLoad()
let tapViewGesture = UITapGestureRecognizer(target: self, action: #selector(PostVC.didTapViewForDismissKeyboard))
scrollView.addGestureRecognizer(tapViewGesture)
tapViewGesture.delegate = self
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
view.endEditing(true)
return false
func didTapViewForDismissKeyboard(_ pressed: UIGestureRecognizer)
view.endEditing(true)
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
print("HIHI")
extension PostVC: UIGestureRecognizerDelegate
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
return true
【问题讨论】:
【参考方案1】:尝试实现UIGestureRecognizerDelegate
。在您的代码中实现其 gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)
方法以返回 true
- 这样您的手势识别器将工作,但它也将允许识别其他手势(特别是 collectionView
中的那个)。
代码:
// add this to initializing code to set gesture recognizer's delegate to self
tapViewGesture.delegate = self
委托实施:
extension YourViewController: UIGestureRecognizerDelegate
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
return true
【讨论】:
嗨。结合你的答案和@duncan 的答案。我真的很亲近。请看我的更新 即使您不使用邓肯的答案并且没有 shouldReceive 实现也会发生这种情况吗? 如果我不使用邓肯的回答,collectionView 还是不行 那我的建议有帮助吗? collectionView和scrollView是什么关系?你知道collectionView 扩展了UIScrollView,因此实际上是一个scrollView 本身?【参考方案2】:不要使用手势识别器。那就是拦截您的水龙头而不是将它们提供给集合视图。而是在collectionView(_:didSelectItemAt:)
方法中调用view.endEditing(true)
。
【讨论】:
不会在collectionView(_:didSelectItemAt:)
方法中调用view.endEditing(true)
为您做这件事吗?
无论如何要关闭键盘而不是将 view.endEditing(true) 放在 collectionView(_:didSelectItemAt:) 中?
因为我的collectionview在我的视野中只占了一点空间
我不确定手势识别器是否会在失败时将点击传递给视图。您可以尝试为您的手势识别器设置一个委托,实现 gestureRecognizer(_:shouldReceive:)
方法并返回 false(在调用 view.endEditing(true)
之后)。
感谢您的帮助。我想我快到了。请看我的更新以上是关于与 UITapGestureRecognizer 一起使用时未调用 collectionView 的 didSelectItemAt的主要内容,如果未能解决你的问题,请参考以下文章
使 UITapGestureRecognizer 不消耗与视图无关的点击
与 UITapGestureRecognizer 一起使用时未调用 collectionView 的 didSelectItemAt
您在哪里声明与 Swift 中的 addGestureRecognizer() 相关的 UITapGestureRecognizer()?