如何触发集合视图的 didSelectItemAtIndexPath: 在滚动时点击?

Posted

技术标签:

【中文标题】如何触发集合视图的 didSelectItemAtIndexPath: 在滚动时点击?【英文标题】:How do I trigger a collection view's didSelectItemAtIndexPath: on tap while it's scrolling? 【发布时间】:2016-07-26 19:07:00 【问题描述】:

集合视图处于中间滚动时的默认行为:

点击 #1:停止滚动 点击#2:触发didSelectItemAtIndexPath

集合视图处于中滚动状态时我想要什么:

点击#1:触发didSelectItemAtIndexPath

什么是实现这一目标的干净、正确的方法? FWIW,我意识到这可能是意想不到的行为。

【问题讨论】:

【参考方案1】:

我认为最好的方法是使用 UICollectionView addGestureRecognizer 添加触摸手势识别器,然后处理触摸手势(例如,在集合视图中获取触摸位置,使用它来获取被触摸项目的 indexPath,然后自己调用 collectionView.didSelectItemAtIndexPath )。至于滚动,您可以使用 UISrollViewDelegate 方法在滚动开始后禁用集合视图上的用户交互,然后在滚动停止和/或在 viewDidDisappear 视图控制器函数中重新启用集合视图上的用户交互。

像这样:

公共类 MyViewController: UIViewController

@IBOutlet 弱变量 collectionView: UICollectionView!

var collectionViewTap:UITapGestureRecognizer?

覆盖公共函数 viewDidLoad()

collectionViewTap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
self.view.addGestureRecognizer(collectionViewTap!)

覆盖 public func viewDidDisappear(animated: Bool)

  collectionView.userInteractionEnabled = true

func handleTap (sender:UITapGestureRecognizer)

let touchPoint = sender.locationOfTouch(0, inView: collectionView)

let indexPath = collectionView.indexPathForItemAtPoint(touchPoint)

if (indexPath != nil) 
    collectionView(collectionView, didSelectItemAtIndexPath: indexPath!)

public func scrollViewWillBeginDragging(scrollView: UIScrollView)

   collectionView.userInteractionEnabled = false

public func scrollViewDidEndDecelerating(scrollView: UIScrollView)

   collectionView.userInteractionEnabled = true

【讨论】:

我不敢相信这没有很多赞,反应很好!

以上是关于如何触发集合视图的 didSelectItemAtIndexPath: 在滚动时点击?的主要内容,如果未能解决你的问题,请参考以下文章

didSelectItemAt 在 SCLAlertView 中不起作用

我们如何在集合视图中重新加载标题视图

如何触发集合视图的 didSelectItemAtIndexPath: 在滚动时点击?

didSelectItemAt 未被调用

如何在 didSelectItemAt indexPath 函数下显示 ViewController? (没有故事板)

collectionView 函数 didSelectItemAt indexPath 将数据传递给下一个视图控制器