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 是 UIButton
、UICollectionView
等,它将自动“拦截”触摸事件。怎么会这样?它们都继承自UIResponder
为UIView
s...
【问题讨论】:
【参考方案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
如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?