Ios 删除集合视图中的整行后未删除装饰视图
我通过对Ios 删除集合视图中的整行后未删除装饰视图,ios,uicollectionview,Ios,Uicollectionview,我通过对UICollectionViewFlowLayout进行子分类,将装饰视图添加到UICollectionView中。Im将装饰视图放置在集合视图的每一行下。它工作得很好。装饰视图出现。但问题是,删除一整行项目后,装饰视图不会从集合视图中删除。但是页眉和页脚视图被正确地重新定位了,这不是我处理的。我不知道删除后在何处删除装饰视图。帮助我。我在prepareLayout中对装饰视图的计算很好,装饰视图和框架的数量是正确的 (图1)删除前(图2)删除后我没有从任何其他来源得到答案。所以我将根
UICollectionViewFlowLayout
进行子分类,将装饰视图添加到UICollectionView
中。Im将装饰视图放置在集合视图的每一行下。它工作得很好。装饰视图出现。但问题是,删除一整行项目后,装饰视图不会从集合视图中删除。但是页眉和页脚视图被正确地重新定位了,这不是我处理的。我不知道删除后在何处删除装饰视图。帮助我。我在prepareLayout
中对装饰视图的计算很好,装饰视图和框架的数量是正确的
(图1)删除前(图2)删除后我没有从任何其他来源得到答案。所以我将根据我的经验来回答。实际上,集合视图在删除项目后不会删除装饰视图的甚至补充视图(页眉/页脚)。您必须手动执行的操作。这可能是collectionView中的一个bug
在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];
}
}
这实际上不是一个bug。装饰视图独立于数据源
装饰视图是增强集合视图布局外观的视觉装饰。与单元格和补充视图不同,装饰视图仅提供视觉内容,因此独立于数据源。您可以使用它们来提供自定义背景、填充单元格周围的空间,甚至根据需要模糊单元格。装饰视图仅由布局对象定义和管理,不与集合视图的数据源对象交互
如果您想说,在集合视图后面添加一个背景图像,它的显示保持独立于数据,则装饰视图更合适
页眉、页脚和其他补充视图可以通过以下方法使用数据源进行更新:
collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView
它们的定位和布局可以通过覆盖来控制
layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]?
及
从自定义流布局中
在我看来,解决此问题的最佳方法是,如果您不想手动查找并删除装饰视图,则应将装饰视图替换为补充视图,这样就可以使用数据源进行更新。从iOS 7开始,您可以在自定义布局中覆盖-indexPathsToInsertForDecorationViewOfKind:
和-indexPathsToDeleteForDecorationViewOfKind:
,以便在集合视图数据更改时添加/删除装饰视图。使用中的方法UICollectionViewLayout
要删除补充/装饰视图:
func prepare(forCollectionViewUpdates updateItems: [UICollectionViewUpdateItem])
func indexPathsToDeleteForSupplementaryView(ofKind elementKind: String) -> [IndexPath]
func indexPathsToInsertForDecorationView(ofKind elementKind: String) -> [IndexPath]
如果你不熟悉,那么,你应该认真阅读你有这样的例子吗
func prepare(forCollectionViewUpdates updateItems: [UICollectionViewUpdateItem])
func indexPathsToDeleteForSupplementaryView(ofKind elementKind: String) -> [IndexPath]
func indexPathsToInsertForDecorationView(ofKind elementKind: String) -> [IndexPath]