删除集合视图中的整行后,装饰视图没有被删除
Posted
技术标签:
【中文标题】删除集合视图中的整行后,装饰视图没有被删除【英文标题】:Decoration view not getting removed after deleting entire row in collection view 【发布时间】:2013-03-07 07:00:53 【问题描述】:我通过子类UICollectionViewFlowLayout
向UICollectionView
添加了装饰视图。我m placing decoration view under each row in collection view. It
s 工作正常。出现装饰视图。但问题是删除一整行项目后,装饰视图没有从集合视图中删除。但是页眉和页脚视图已正确重新定位,它不是由我处理的。我不知道删除后在哪里删除装饰视图。帮我。我在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 中的视图?