删除集合视图中的整行后,装饰视图没有被删除

Posted

技术标签:

【中文标题】删除集合视图中的整行后,装饰视图没有被删除【英文标题】:Decoration view not getting removed after deleting entire row in collection view 【发布时间】:2013-03-07 07:00:53 【问题描述】:

我通过子类UICollectionViewFlowLayoutUICollectionView 添加了装饰视图。我m placing decoration view under each row in collection view. Its 工作正常。出现装饰视图。但问题是删除一整行项目后,装饰视图没有从集合视图中删除。但是页眉和页脚视图已正确重新定位,它不是由我处理的。我不知道删除后在哪里删除装饰视图。帮我。我在prepareLayout 中计算的装饰视图很好,装饰视图的数量和框架是正确的

(图1)删除前(图2)删除后

【问题讨论】:

【参考方案1】:

我没有从任何其他来源得到答案。所以我会根据我的经验来回答。实际上,collection view 在删除item 后并不会移除装饰视图的补充视图(页眉/页脚)。你必须手动完成。可能这将是collectionView中的一个错误。

移除 prepareLayout 方法中的装饰视图

 /// Collection view is not removing the added decoraion views afeter deletion. Remove yourself to fix that
for (UIView *view in self.collectionView.subviews) 
    if ([view isKindOfClass:[DecorationView class]])
    
        [view removeFromSuperview];
    


【讨论】:

【参考方案2】:

使用UICollectionViewLayout中的方法去除补充/装饰视图:

func prepare(forCollectionViewUpdates updateItems: [UICollectionViewUpdateItem])

func indexPathsToDeleteForSupplementaryView(ofKind elementKind: String) -> [IndexPath]

func indexPathsToInsertForDecorationView(ofKind elementKind: String) -> [IndexPath]

如果你不熟悉它们,那么你应该仔细阅读document

【讨论】:

【参考方案3】:

ios 7 开始,您可以在自定义布局中覆盖 -indexPathsToInsertForDecorationViewOfKind:-indexPathsToDeleteForDecorationViewOfKind:,以便在集合视图数据更改时添加/删除装饰视图。

【讨论】:

【参考方案4】:

这实际上不是错误。装饰视图per the docs 独立于数据源。

装饰视图是增强集合视图布局外观的视觉装饰。与单元格和补充视图不同,装饰视图仅提供视觉内容,因此独立于数据源。您可以使用它们来提供自定义背景、填充单元格周围的空间,甚至可以根据需要隐藏单元格。装饰视图仅由布局对象定义和管理,不与集合视图的数据源对象交互。

如果你想说,在你的集合视图后面添加一个背景图像,装饰视图会更合适,它的显示保持独立于数据。

页眉、页脚和其他补充视图可以通过以下方法使用数据源进行更新:

  collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView

并且它们的定位和布局可以通过覆盖来控制

layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? 

layoutAttributesForSupplementaryViewOfKind(elementKind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! 

从您的自定义流程布局中。

在我看来,解决问题的最佳方法是,如果您不想手动查找和删除装饰视图,则可以将装饰视图替换为补充视图,这样可以使用数据源。

【讨论】:

你有这方面的例子吗

以上是关于删除集合视图中的整行后,装饰视图没有被删除的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不删除视图并重新添加的情况下更新 StackView 中的视图?

如何在xamarin中删除集合视图中的一个单元格和sqlite中的行的删除按钮?

如何从集合视图中的不可见单元格中删除自定义视图

删除从部分删除的所有行后出现的 Tableview 部分

使用协议从集合视图单元格中删除核心数据

如何使用单元格中的按钮删除集合视图中的项目?