无法点击 UICollectionView 项目

Can't tap UICollectionView item

我正在构建一个应用程序,而我有一个具有自定义布局的 UICollectionView。我有一个问题,但我无法点击某些行。这是对发生的事情的概述

1) 应用程序启动并呈现 UICollectionView

2) 显示了3个测试项,使用Xcode中的可视化调试器,可以看到层级不对

现在不能点击红色行,但是黄色和绿色行可以。

3) 用户点击黄色项目,然后转到另一个页面

4) 用户将显示的 UIViewController 和 returns 弹出到 UICollectionView,而 viewWillAppear 方法重新加载 UICollectionView,如下所示:

[self.collectionView reloadData];

5) 重新进入可视化调试器发现层级错位了,现在黄色行不可点击,但是红色和绿色行可以点击。

这可能是什么原因?我会post任何相关代码,询问您希望看到的部分。

更新

UIViewController显示UICollectionView

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
ShareViewCell *view = [collectionView dequeueReusableCellWithReuseIdentifier:@"share" forIndexPath:indexPath];
view.share = [self.sharesController shareAtIndex:indexPath.item];
return view;
}

自定义单元格:

- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {

    self.leftBorderView = [UIView new];
    [self.contentView addSubview:self.leftBorderView];

    self.label = [UILabel new];
    self.label.font = [UIFont boldSystemFontOfSize:10];
    self.label.numberOfLines = 0;
    self.label.lineBreakMode = NSLineBreakByWordWrapping;
    [self.contentView addSubview:self.label];
}
return self;
}

- (void)layoutSubviews
{
[super layoutSubviews];

self.leftBorderView.frame = CGRectMake(0, 0, 1.5, self.bounds.size.height);
CGSize labelSize = [self.label sizeThatFits:CGSizeMake(self.bounds.size.width - 10.0f, MAXFLOAT)];

NSTimeInterval durationOfShare = [self.share.endSpan timeIntervalSinceDate:self.share.startSpan] / 3600;

CGFloat middleOfCell = self.bounds.size.height / 2;
CGFloat yPositionToUse = middleOfCell - (labelSize.height / 2);

if (durationOfShare < 0.25)
{
    [self.label setHidden:YES];// to small to be shown
} else if (durationOfShare > 0.5)
{
    yPositionToUse = 8; // show it at the top
}

self.label.frame = CGRectMake(8, yPositionToUse, labelSize.width, labelSize.height);
}

更新 2

UICollectionReusableView 是否阻塞了 UICollectionViewCell 的点击?

好的,

首先,您的问题应该更准确:您使用的是 上的一些代码。

代码好像是这样Calendar UI made with UICollectionView。 这是一个示例代码,为了 Whosebug 的答案(有赏金)而快速构建。尚未完成,没有贡献者,您应该尝试阅读并改进它!

从调试器的捕获来看,您似乎有一些视图覆盖在 collectionView 的单元格之上。 通过阅读这段代码,我看到它使用一些补充视图来呈现 'hour' 块。这个补充观点class是HourReusableView。它是调试器捕获中最重要的视图

CalendarViewLayout 负责计算这些补充视图框架,就像它对彩色事件块所做的那样(参见方法 - (void)prepareLayout

我敢打赌,这些补充视图的 Z-order 是不可预测的 - 所有视图的默认 zIndex 均为 0。一种解决方法?在line 67 of this file之后,在小时块的UICollectionViewLayoutAttributes上设置一个负数zIndex。这样,您可以确保小时补充视图始终在您的单元格后面,并且不会拦截单元格的触摸