使 UICollectionViewCell 的一部分不可点击

Posted

技术标签:

【中文标题】使 UICollectionViewCell 的一部分不可点击【英文标题】:Make part of an UICollectionViewCell not clickable 【发布时间】:2014-03-31 22:14:36 【问题描述】:

基本上我想做的是在 UICollectionView 中有一个单元格,它的哪一部分会响应点击,而一部分不会。 这个单元格将是一个正常的单元格,点击时会展开,在展开的区域显示一个子视图,不响应点击。

我考虑过扩展单元格并在上方添加一个子视图,这将是不可点击的。但我认为这是一种“糟糕”的实现方式。

有没有最好的方法?

这就是我想做的:

感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

你需要子类UICollectionViewCell,然后覆盖hitTest:withEvent而不是pointInside:withEvent,在hitTest:withEvent:内你应该定义targetRect,然后检查用户点击的点是否在targetRect内。

这是适用于我的tableViewCell 的代码(collectionViewCell 类似)。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    CGRect targetRect = CGRectMake(0, 0, CGRectGetWidth(self.bounds), 20);
    if (CGRectContainsPoint(targetRect, point)) 
        return nil;
     else 
        return [super hitTest:point withEvent:event];
    

【讨论】:

感谢您的回复,您的解决方案看起来确实很有趣且合理。但是,我不久前发布了这个问题,我通过使用 UICollectionViewCell 和 UIView 解决了这个问题。因此,我将单元格扩展到所需的大小,并在新扩展区域的顶部放置一个视图。由于我目前不在该项目上工作,因此我现在无法验证您的答案。但是,一旦我可以尝试您的解决方案,我会给您反馈。无论如何感谢您的帮助! =) 很高兴听到您已修复它。在扩展区域上盖上盖子是一个不错的选择。【参考方案2】:

在选择器中

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

你必须返回一个单元格,在这个函数中你应该确定该单元格是否是可点击的,然后简单地做

cell.userInteractionEnabled = shouldAllowTouch;

【讨论】:

但这会使所有单元格都无法点击,我希望顶部保持可点击状态,如图所示。 你可以制作不可点击的单元格部分视图 或者,将您不想在其自己的单元格中选择的内容设置为不启用该单元格的用户交互 除非您继承 UICollectionViewCell,实现 pointInside 方法并在触摸位于不可选择区域时返回 NO,否则不可能使单元格的一部分可选,但如果它仍然调用确实选择单元格,则再次 idk在索引路径

以上是关于使 UICollectionViewCell 的一部分不可点击的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell -- 使 selectedBackgroundView 比单元格本身大

使 UICollectionViewCell 出现在 UICollectionView 的中心

Swift:使 UIGestureRecognizer 只影响一个 UICollectionViewCell 而不是全部

使 UICollectionViewCell 的一部分不可点击

在 UICollectionViewCell 上设置 .reuseIdentifier

UICollectionViewCell 不是圆角