在 UICollectionView 上放置一个按钮并保持滚动

Posted

技术标签:

【中文标题】在 UICollectionView 上放置一个按钮并保持滚动【英文标题】:Place a button over UICollectionView and maintain the scroll 【发布时间】:2015-07-27 16:40:41 【问题描述】:

我有一个 UICollectionView 和一个 UIButton 在它上面(在右边缘)。但是在按钮的框架中,collectionView 失去了它的滚动属性。

我不知道是否有任何方法可以保持两种交互,即内部的 Button 触摸和 CollectionView 的滚动。

【问题讨论】:

【参考方案1】:

好吧,我想出了如何做到这一点,但我使用 UITapGestureRecognizer 而不是按钮,因为 rounak 建议:

    let tapGesture = UITapGestureRecognizer(target: self, action: "collectionViewDidReceiveTap:")
    tapGesture.delegate = self
    self.collectionView.addGestureRecognizer(tapGesture)

因为我希望一个特定的矩形是“可点击的”,所以我已经实现了 UIGestureRecognizerDelegate 协议,这段代码是这样做的:

public func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool 
    let collectionViewCurrentCell = self.collectionView.layoutAttributesForItemAtIndexPath(NSIndexPath(forItem: Int(self.currentPage), inSection: 0))
    let cellFrameInSuperview = collectionView.convertRect(collectionViewCurrentCell!.frame, toView: self)

    if gestureRecognizer.isKindOfClass(UITapGestureRecognizer) && CGRectContainsPoint(cellFrameInSuperview, touch.locationInView(self)) 

        return false
    
    return true

cellFrameInSuperview 应该是 TapGesture 不应该做任何事情的区域。但与 UIButton 不同的是,滚动继续在所有 Collection 范围内起作用。

如果您对它的工作原理或原因有任何疑问,请发表评论。

【讨论】:

在所有解决方案中,这是最适合我的一个【参考方案2】:

使用带有点击手势识别器的视图代替按钮,并让点击手势识别器与滚动视图的平移手势同时工作。

【讨论】:

嗯,好的,我用过它,它可以工作,但现在我丢失了我的 collectionView 委托的任何“didSelectItemAtIndexPath”调用

以上是关于在 UICollectionView 上放置一个按钮并保持滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 UICollectionView 部分之间的单元格拖动?

UICollectionView 水平对齐滚动第一个单元格中心对齐第一次使用 Swift 时不完全放置中心位置

无法按我的意愿设计 uicollectionview

仅通过按下按钮滚动 UICollectionView

按像素或百分比滚动 UICollectionView?

补充标题的 UICollectionView 位置