将UICollectionView的某些部分的触摸传递给基础视图

时间:2016-04-06 22:27:08

标签: ios objective-c uicollectionview uigesturerecognizer uicollectionviewcell

首先看一下已成像的图像: enter image description here

我的hiearchy看起来如下:

  • 的UIView
    • 的UIButton
    • UICollectionView
      • UICollectionViewCell
      • UICollectionViewCell
      • UICollectionViewCell
      • UICollectionViewCell

UICollectionView作为H:[collectionView(==270)]|V:|-(70)-[collectionView]-(70)-|添加到UIVew。

我有两个要求:

1)只有UICollectionViewCell的蓝色部分才能触发collectionView::didSelectItemAtIndexPath:方法。我用

实施了这项工作
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self.customView) {
        return self;
    }
    return nil;
}

在自定义类UIColectionViewCell上。 customView属性是单元格的蓝色/红色UIView。 这可以按预期工作。

2)我想要在UICollectionViewCell的绿色部分或UICollectionVIew本身(白色背景为0.5不透明度)中传递的任何手势(Tap / LongTap / Pan / ...)向下传递到超级视图。例如下面的绿松石UIButtion。 绿色部分也不应该滚动CollectionView ..它只需要对任何手势完全透明。

我该怎么做?尝试了很多不同的方法,但没有一个工作。我知道如何使用常规UIView,但无法使它在UICollectionView及其单元格上工作。

请记住,还有其他UIViews或UIButtions可以互动,并放置在集合视图的绿色部分下。之后的绿色将是UIClearColor。

建议让UICollectionView的宽度更小(蓝色部分的宽度)不是一个选项,因为在某些情况下,UICell的蓝色/红色部分必须延伸到单元格的整个宽度。

2 个答案:

答案 0 :(得分:1)

以上是上述示例的最终解决方案:

1)只需要红色/蓝色部分可点击。 这基本保持不变。我引用了蓝色/红色UIView名称customView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self.customView) {
        return self;
    }
    return nil;
}

2)应忽略UICollectionView中未在蓝/红UIViews上进行的任何交互。

对UICollectionView进行子类化并添加覆盖此metod:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

    NSIndexPath *indexPath = [self indexPathForItemAtPoint:point];
    LCollectionViewCell *cell = (LCollectionViewCell*)[self cellForItemAtIndexPath:indexPath];

    if (cell && [self convertPoint:point toView:cell.customView].x >= 0) {
        return YES;
    }
    return NO;
}

这将检查CGPoint是否在customView上完成。有了这个,我们也支持可变宽度:

enter image description here

答案 1 :(得分:1)

你的答案对我有所帮助,谢谢!

这是Swift 3.0中的解决方案:

 override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let hitView = super.hitTest(point, with: event)
    if hitView == self.customView {
        return self
    }
    return nil
}