无法点按UICollectionView项

时间:2016-01-01 16:03:35

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

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

1)应用程序启动并显示UICollectionView

2)显示3个测试项目,使用Xcode中的可视化调试器,您可以看到层次结构中存在不正确的内容

enter image description here

现在无法点按红色行,但黄色和绿色行可以。

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

4)用户弹出显示的UIViewController并返回UICollectionView,而viewWillAppear方法重新加载UICollectionView,如下所示:

[self.collectionView reloadData];

5)重新进入可视化调试器显示层次结构似乎已移位,黄色行现在无法应用,但可以点击红色和绿色行。

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

enter image description here

更新

显示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

enter image description here

1 个答案:

答案 0 :(得分:2)

好的,

首先,您应该在问题中更精确:您使用some question on StackOverflow上的某些代码。

代码似乎是Calendar UI made with UICollectionView。 这是一个示例代码,为StackOverflow答案快速构建(带有赏金)。它没有完成,没有贡献者,你应该尝试阅读并改进它!

从您的调试器捕获中,您似乎有一些视图覆盖在您的collectionView的单元格之上。 通过阅读此代码,我看到它使用一些补充视图来呈现&#39; hour&#39;块。此补充视图类为HourReusableView。并且它是调试器捕获的最佳视图

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

我可能会打赌这些补充观点的Z顺序是不可预测的 - 所有观点的默认zIndex为0.修复它的一种方法是什么?在line 67 of this file之后,在小时区的zIndex设置否定UICollectionViewLayoutAttributes。这样,您可以确保小时补充视图始终位于您的单元格后面,并且不会拦截单元格的触摸