在 UiCollectionView 中处理触摸?

Posted

技术标签:

【中文标题】在 UiCollectionView 中处理触摸?【英文标题】:Handle Touch in UiCollectionView? 【发布时间】:2015-05-08 09:51:26 【问题描述】:

我有一个很大的UICollectionView 占据了屏幕的大部分,还有一个UIButton 显示了一个菜单。当用户点击屏幕的任何一侧时,我想隐藏菜单,不幸的是,这对我来说变成了UICollectionView 的任何部分。尝试了以下代码的其他视图,它运行良好......但不适用于UICollectionView。该函数不会被调用。

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)             
   hidemenu()
   self.view.endEditing(true)            

有什么问题?感谢您的宝贵时间。

如何在UICollectionView所在的UIViewController中触发touchesBegan

Here is the project.

【问题讨论】:

您可以尝试在菜单打开时禁用集合视图的用户交互,这样应该调用touchesBegan。关闭菜单后,您可以再次启用它。 我不能那样做...菜单和集合视图在不同的类中..我认为如此安静的复杂 好的,这个帖子可能对您有所帮助。这里讨论的是 tableview ,你可以试试 collectionview ***.com/questions/5848221/touch-events-on-uitableview 【参考方案1】:

在点击滚动控制器(如 UIScrollView、UITableView、UICollection 等)时不会调用 touchesBegan 方法。因为他们有自己的selector 方法。要处理这种情况,您需要在UICollectionView 上创建UITapGesture。在点击UICollectionView 时,它的选择器方法被调用并做任何你想做的事情。

这里是指导您的链接。如何在UICollectionView 上创建双击手势。借助此功能,您也可以创建单个 Tap 手势。

Collection View + Double Tap Gesture

编辑: 进行以下更改,它工作正常。

第 1 步:在 SwipeMenuViewController 中声明 handleTap

func handleTap(sender: UITapGestureRecognizer) 

        println("called swipe")

    

第二步:创建SwipeMenuViewController控制器的全局变量。那是在viewDidLoad()之外的地方

var vc2 = SwipeMenuViewController()

第三步:在viewDidLoad()中声明TapGesture

var tap = UITapGestureRecognizer(target: vc2, action : "handleTap:")
        tap.numberOfTapsRequired = 1
        self.collectionView.addGestureRecognizer(tap)

输出

称为滑动

希望对您有所帮助。

【讨论】:

好的,我正在尝试这个..但我希望将目标指向另一个视图控制器,因为隐藏菜单的方法在其他类中......它不起作用......我可以将目标分配给另一个类? var tap = UITapGestureRecognizer(target: SwipeMenuViewController(), action : "show") collectionView.addGestureRecognizer(tap) 但动作没有被调用..它抛出异常并且无法识别的选择器发送到实例 但没有……我检查了方法名称……很好……:( 现在我正在电话的帮助下聊天。我会检查并通知你。您仍然可以在委托的帮助下将点击手势事件从当前类重定向到另一个类。 @copeME,我已经检查了场景,它似乎工作正常。【参考方案2】:

您可以将 UITapGestureRecognizer 添加到 UICollectionView 并创建一个操作以在用户触摸您的集合之外或任何地方时关闭视图。

第 1 步创建用于关闭视图的点击手势

override func viewDidLoad() 
    super.viewDidLoad()
     ...

    let tap = UITapGestureRecognizer(target: self, action: #selector(didTapOutsideCollectionView(recognizer:)))
    tap.numberOfTapsRequired = 1
    self.collectionView.addGestureRecognizer(tap)

第 2 步通过点击位置执行您想要的操作

@objc func didTapOutsideCollectionView(recognizer: UITapGestureRecognizer)
    let tapLocation = recognizer.location(in: self.view)
    //The point is outside of collection cell
    if collectionView.indexPathForItem(at: tapLocation) == nil 
         dismiss(animated: true, completion: nil)
    

【讨论】:

【参考方案3】:

你可以直接使用这个方法,只要用户点击集合视图的任何部分,你的菜单就会自动隐藏:-

func collectionView(_ collectionView: UICollectionView,
    didSelectItemAtIndexPath indexPath: NSIndexPath)

    hidemenu()
        self.view.endEditing(true)    

要检测单元格之间空格的点击,这里是代码

self.collectionView.backgroundView = [[UIView alloc] initWithFrame:self.collectionView.frame];
self.collectionView.backgroundView.userInteractionEnabled = YES;

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)];
self.collectionView.backgroundView.gestureRecognizers = @[tapRecognizer];

【讨论】:

可能不起作用..如果我有很大的集合视图并且上面的单元格很少?? 我不认为你得到了点队友..只有点击它才有效。 对不起..我说我必须为此点击一个单元格..我在单元格之间有一些空格..所以当用户点击空格时怎么办..所以它对我不起作用 好的..我正在尝试...但是将目标设置为另一个类不会调用该操作 “将目标设置为另一个类”是什么意思?

以上是关于在 UiCollectionView 中处理触摸?的主要内容,如果未能解决你的问题,请参考以下文章

iOS UICollectionView左右滚动和上下滑动处理

触摸单元格时 UICollectionView 崩溃

如何检测 UICollectionView 上的触摸?

UICollectionView 触摸时动画

将 UICollectionView 触摸事件传递给其父 UITableViewCell

如何在按钮触摸时更改 UICollectionView 框架