iOS:向容器视图添加 UITapGestureRecognizer 会拦截 UICollectionView 的 didSelectItemAtIndexPath 方法

Posted

技术标签:

【中文标题】iOS:向容器视图添加 UITapGestureRecognizer 会拦截 UICollectionView 的 didSelectItemAtIndexPath 方法【英文标题】:iOS: Adding UITapGestureRecognizer to container view intercepts UICollectionView's didSelectItemAtIndexPath method 【发布时间】:2014-12-27 03:17:18 【问题描述】:

我在 ViewController 的主 Content View 中添加了一个 UITapGestureRecognizer,以便在点击内容视图时关闭我的键盘。

问题是我的内容视图中有一个UICollectionView,设置UITapGestureRecognizer 会拦截我的UICollectionView 的点击。

如何让我的UICollectionView 的点击通过,以便didSelectItemAtIndexPath 方法再次触发?

func setupGestureRecognizer() 
    let dismissKeyboardTap = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    contentView.addGestureRecognizer(dismissKeyboardTap)


func dismissKeyboard() 
    contentView.endEditing(true)

【问题讨论】:

【参考方案1】:

解决此问题的方法是将 .cancelsTouchesInView = false 添加到您的 UITapGestureRecognizer

这允许其他视图内的触摸通过,例如 UITableViewCell 触摸。

func setupGestureRecognizer() 
    let dismissKeyboardTap = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    dismissKeyboardTap.cancelsTouchesInView = false
    contentView.addGestureRecognizer(dismissKeyboardTap)


func dismissKeyboard() 
    contentView.endEditing(true)

【讨论】:

嗯,这在 Swift 4.2 ios 12 上对我不起作用 :(【参考方案2】:

试试这个

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    [self.view endEditing:YES];
  

并删除您的 tapGesture。

【讨论】:

这会停止拦截UICollectionView,但不会在点击屏幕上的任何位置时关闭键盘。

以上是关于iOS:向容器视图添加 UITapGestureRecognizer 会拦截 UICollectionView 的 didSelectItemAtIndexPath 方法的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 向应用程序窗口添加导航栏

将多个容器视图放在 ios 中的分页 UIScrollView 中

向每个表格视图单元格添加数字 - iOS

iOS如何向键盘添加视图

如何在 iOS 中异步向 UITableViewCell 添加视图?

iOS 键盘扩展 - 向标准键盘添加按钮(系统范围的输入附件视图)