我正在构建一个应用程序,而我有一个UICollectionView
的自定义布局。我有一个问题,而我无法点击一些行。这是对发生的事情的概述
1)应用程序启动并显示UICollectionView
2)显示3个测试项目,使用Xcode中的可视化调试器,您可以看到层次结构中存在不正确的内容
现在无法点按红色行,但黄色和绿色行可以。
3)用户点击黄色项目,然后转到另一个页面
4)用户弹出显示的UIViewController
并返回UICollectionView
,而viewWillAppear
方法重新加载UICollectionView
,如下所示:
[self.collectionView reloadData];
5)重新进入可视化调试器显示层次结构似乎已移位,黄色行现在无法应用,但可以点击红色和绿色行。
这可能是什么原因?我会发布任何相关代码,询问您希望看到的部分。
更新
显示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
?
答案 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
。这样,您可以确保小时补充视图始终位于您的单元格后面,并且不会拦截单元格的触摸