我的hiearchy看起来如下:
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的蓝色/红色部分必须延伸到单元格的整个宽度。
答案 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
上完成。有了这个,我们也支持可变宽度:
答案 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
}