无法点击 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
。这样,您可以确保小时补充视图始终在您的单元格后面,并且不会拦截单元格的触摸
我正在构建一个应用程序,而我有一个具有自定义布局的 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
。这样,您可以确保小时补充视图始终在您的单元格后面,并且不会拦截单元格的触摸