将UICollectionView触摸事件传递给其父UITableViewCell

时间:2015-11-04 01:47:08

标签: ios uitableview uicollectionview

这是视图结构:

外部视图是UITableView

UITableViewCell内,有一个UICollectionView。请注意,集合视图单元格之间存在一些黑色间距。

当我点击UICollectionView中的间距时,我希望触摸事件传递给UITableViewCell

screenshot

5 个答案:

答案 0 :(得分:11)

@tounaobun的优秀答案。经过测试,它按预期工作:

1)如果你点击集合视图中不是项目的任何地方,那么下面的表格单元格将选择正常。

2)如果你点击集合视图中的项目,那么表格单元格将不会选择,你可以正常地与集合视图交互(也就是说,滚动,调用didSelectItem等)

我转为swift作为参考:

斯威夫特3:

class TableCellCollectionView: UICollectionView { 

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

}

只需将此类定义添加到您的代码中(我将它放在实用程序文件中),然后将集合视图的类从UICollectionView更改为TableCellCollectionView,您应该全部设置。

答案 1 :(得分:6)

google之后,我找到了一个解决方案。只需继承UICollectionView类并覆盖hitTest:withEvent方法。

<强> CustomCollectionView.h

@interface CustomCollectionView : UICollectionView

@end

<强> CustomCollectionView.m

@implementation CustomCollectionView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    UIView *hitView = [super hitTest:point withEvent:event];

    if ([hitView isKindOfClass:[self class]]) {
        // If it is class UICollectionView,just return nil.
        return nil;
    }
    // else return super implementation.
    return [super hitTest:point withEvent:event];
}

@end

答案 2 :(得分:2)

最高投票答案的代码可以轻松缩短。

Swift 4.1:

final class InteractiveCollectionView: UICollectionView {
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        return super.hitTest(point, with: event) as? InteractiveCollectionView
    }
}

答案 3 :(得分:0)

是否可以将collectionView的backgroundView UserInteraction设置为不启用,但请确保collectionViewCell已执行,以便它可以将tapEvent传递给下一个响应者。

- (void)viewDidLoad {
    theCollectionView.userInteractionEnabled = NO;
}

我希望它会有所帮助。

答案 4 :(得分:0)

您可以覆盖point(inside:with:)的{​​{1}}方法,并手动检查是否有任何单元格包含指定的点:

UICollectionView