与 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()?

怎么让UITapGestureRecognizer单击事件与TouchBegan事件不冲突

UITapGestureRecognizer 的问题

带有手势的 UITapGestureRecognizer