隐藏 UICollectionViewCell
Posted
技术标签:
【中文标题】隐藏 UICollectionViewCell【英文标题】:Hiding UICollectionViewCell 【发布时间】:2013-07-15 18:23:50 【问题描述】:我试图在集合视图中隐藏UICollectionViewCell
。虽然我成功了
cell.hidden = YES; //or cell.alpha = 0.0;
但在滚动后,单元格再次出现。我还尝试了以下方法:
UICollectionViewLayoutAttributes *layoutAttr = <get the layout attribute>//I'm succesfull here
layout.hidden = YES;
[cell applyLayoutAttributes:layoutAttr];
我认为这可能是因为我正在使用dequeReusable..
方法,因此正在重新使用单元格,但是
我还尝试在collectionView:cellForItemAtIndexPath:
方法中隐藏单元格,但无济于事。在这里它甚至似乎不起作用。
为什么这不起作用?如何隐藏UICollectionViewCell
?
编辑:包括collectionView:cellForItemAtIndexPath:
的实现:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
static NSString *identifier = @"Cell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.layer.cornerRadius = 12.0f;
cell.backgroundColor = [UIColor colorWithRed:0.830 green:0.899 blue:1.000 alpha:1.000];
cell.selectedBackgroundView = [[UIView alloc]initWithFrame:cell.frame];
cell.selectedBackgroundView.backgroundColor = [UIColor lightTextColor];;
cell.layer.borderColor = [UIColor blackColor].CGColor;
cell.layer.borderWidth = 2.0f;
cell.hidden = YES;
UILabel *lbl = (UILabel *)[cell viewWithTag:10];
NSArray *interArray = numberArray[indexPath.section];
[lbl setText:[interArray[indexPath.row] stringValue]];
return cell;
这应该隐藏所有单元格吧?但不,这不会发生。
【问题讨论】:
developer.apple.com/library/ios/#documentation/WindowsViews/… @stosha:我浏览了文档,但找不到任何东西。能具体一点吗? 我也在尝试不对任何提供的集合视图类进行子类化。 可能是 cell.contentView.frame = CGRectMake(..,..,0.0,0.0); ? 不隐藏 contentView 并没有帮助它仍然在屏幕上留下单元格的框架和边框。当我做 cell.frame = CGRectZero 它不起作用; 【参考方案1】:由于隐藏单元格本身似乎不起作用,您可以向单元格添加与集合视图的背景颜色相同颜色的子视图,或者您可以隐藏单元格的内容视图,这确实有效:
cell.contentView.hidden = YES;
cell.backgroundColor = self.collectionView.backgroundColor;
仅当您为单元格设置了背景颜色时,才需要第二行。
【讨论】:
这个解决方案使单元格空间可用,单元格也是可触摸的【参考方案2】:有一个简单的方法:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
CGSize retval;
......
//for the cell you want to hide:
if(hidden_flag)
retval = CGSizeZero;
else
retval = CGSizeMake(320,50);
return retal;
您可以在上述函数中检查一个标志,如果设置了标志,则返回零大小的值;如果不是,则返回正常值。任何其他委托/数据源方法都不需要更改。该标志可以在其他地方设置/重置。一旦标志改变,你需要调用:
hidden_flag = YES;
[self.collectionView reloadData];
无需更改cellForItemAtIndexPath
。
【讨论】:
这个答案有效,但出于某种原因,当我这样做时,虽然我得到了糟糕的滚动性能,那么如果我只是让单元格保持正常大小 糟糕的滚动性能是什么意思?如果有问题,您可能需要调整集合视图的高度。但由于不确定到底是什么问题,所以我现在只能建议这样做。 我认为这是因为我在下面隐藏了很多部分,但实际上仍然需要绘制所有这些部分并进行一些计算。也许更好的解决方案就是插入和删除部分【参考方案3】:因为当您的单元格滚动到视野之外时,它会被回收。当滚动回视图时,集合视图(或表格视图)将通过调用cellForItemAtIndexPath
重新创建它。因此,当为应该隐藏的单元格调用此命令时,您将不得不再次隐藏它。
有可能在您从collectionView:cellForItemAtIndexPath:
返回单元格后,框架正在对其调用[setHidden:NO]
。您可能必须继承 UICollectionViewCell
并提供您自己的实现来完成此操作。或向UICollectionViewCell
添加一个子视图以包含您的内容,然后根据需要隐藏/显示此子视图。
【讨论】:
我明白了,这就是为什么我尝试将它隐藏在你提到的方法中,这也不起作用。 从 collectionView:cellForItemAtIndexPath: 返回单元格后,操作系统可能正在调用 [setHidden:NO] 。您可能必须继承 UICollectionViewCell 并提供您自己的实现来完成此操作。对我来说,这听起来不像是一个典型的用例(例如:我通常希望您希望从数据源中删除数据而不是隐藏单元格)。 @DavisG.:更新问题。 @NicholasHart:我在隐藏中添加了一个观察者,是的,它再次在内部设置为 NO,子类化是唯一的方法吗?我感觉它会变得一团糟。 这可能是最干净的方式。另一个选项是让您构建一个包含单元格内容的子视图,将其作为子视图添加到您的 collectionView:cellForItemAtIndexPath: 中的 UICollectionViewCell:然后根据需要显示/隐藏子视图。【参考方案4】:我知道这个问题很老,但是对于使用 iOS 8+ 的未来开发人员来说,可以在 willDisplayCell 方法中隐藏单元格。
例如,此代码将单元格隐藏在 collectionView 垂直中心。
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
//Hide cell at center
CGPoint centerCellOffset = collectionView.contentOffset;
centerCellOffset.x += collectionView.frame.size.width / 2;
BOOL isCenterCell = CGRectContainsPoint(cell.frame, centerCellOffset);
cell.hidden = isCenterCell;
(PS:在 iOS 10.3 上测试)
【讨论】:
似乎collection view会在动画期间将单元格交换为相同的内容而不调用willDisplayCell:因此新单元格不会被隐藏, @Tjasma,你在说什么动画?您是否使用performBatchUpdates(_:completion:)
为 collectionView 更改设置动画?
我创建了一个带有自定义布局的多部分UICollectionView
。我正在寻找一种折叠部分的方法,手风琴风格。为了尝试隐藏折叠部分中的单元格,我将保持它们的框架不变,但将它们隐藏在 collectionView:willDisplayCell:
这一直有效,直到单元格滚动到屏幕外然后再返回。向后滚动时,单元格显示为未隐藏,没有调用 collectionView:willDisplayCell:
。以上是关于隐藏 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章