隐藏 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的主要内容,如果未能解决你的问题,请参考以下文章

如何显示Word隐藏文字

js隐藏元素jquery隐藏css隐藏

前端使用JS和JQuery显示隐藏标签

如何隐藏开始菜单栏

如何查找所有隐藏文件

《es文件浏览器》隐藏文件查看方法