CollectionViewCell 中的 UILabel 不阻止触摸事件

Posted

技术标签:

【中文标题】CollectionViewCell 中的 UILabel 不阻止触摸事件【英文标题】:UILabel in CollectionViewCell not blocking touch events 【发布时间】:2017-05-18 18:46:21 【问题描述】:

我有什么

A 是UICollectionView B 是UICollectionViewCell

C 是 B 的 UILabel 子视图

+------------------------------+
|A                             |
|                              |
| +----------+    +----------+ |
| |C         |    |B         | |
| |----------|    |          | |
| |          |    |          | |
| |B         |    |          | |
| +----------+    +----------+ |
+------------------------------+

点击 B 时,C 将作为子视图添加到单元格的顶部。当再次点击 B 时,C 将从超级视图 (B) 中移除。

问题

触摸事件“通过”C 到 B。

我似乎找不到如何忽略/阻止这些触摸事件;即,点击UILabel C 不应沿着响应者链传播。

例如,如果 C 是 UIButtonUICollectionView 等,它将自动“拦截”触摸事件。怎么会这样?它们都继承自UIResponderUIViews...

【问题讨论】:

【参考方案1】:

默认情况下,UILabel 没有用户交互 - 所以它不会“拦截”触摸。

如果您在C 标签上设置.isUserInteractionEnabled = true,它应该“吃掉”触摸。

编辑:在快速测试后使用实际的集合视图单元格 ...您还需要向标签添加手势识别器以“吃掉”触摸。在我的(新的、改进的)快速测试中对标签进行子类化对我有用:

class EatTouchesLabel: UILabel 

    var myGest: UIGestureRecognizer!

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)!
        self.commonInit()
    

    override init(frame: CGRect) 
        super.init(frame: frame)
        self.commonInit()
    

    func commonInit() 
        self.isUserInteractionEnabled = true
        if myGest == nil 
            myGest = UITapGestureRecognizer()
            self.addGestureRecognizer(myGest)
        
    


【讨论】:

我尝试的第一件事,但它不起作用,这让我发疯。我的UILabel 是通过自动布局以编程方式设置的,这会改变什么吗? 您确定您的UILabel 在视图层次结构中实际上是高于 B 吗?您可以设置背景颜色并发布其外观的屏幕截图吗?我正在快速测试在按钮上覆盖标签,如果 . isUserInteractionEnabled 设置为 false,则按钮会被触摸...当为 true 时,不。所以....? 很棒的东西,工作完美,应该考虑一下。试图在单元格中覆盖并实现自定义 hitTest 函数,但无法实现我想要的。这更加简单和清晰。谢谢!

以上是关于CollectionViewCell 中的 UILabel 不阻止触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

CollectionViewCell 中的 UILabel 不阻止触摸事件

如何将imageView添加到collectionViewCell中的scrollView

单击 CollectionViewCell 中的按钮

如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?

collectionViewCell 中的按钮不触发功能

嵌套在 CollectionViewCell 中的 TableView