Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 删除集合视图中的整行后未删除装饰视图_Ios_Uicollectionview - Fatal编程技术网

Ios 删除集合视图中的整行后未删除装饰视图

Ios 删除集合视图中的整行后未删除装饰视图,ios,uicollectionview,Ios,Uicollectionview,我通过对UICollectionViewFlowLayout进行子分类,将装饰视图添加到UICollectionView中。Im将装饰视图放置在集合视图的每一行下。它工作得很好。装饰视图出现。但问题是,删除一整行项目后,装饰视图不会从集合视图中删除。但是页眉和页脚视图被正确地重新定位了,这不是我处理的。我不知道删除后在何处删除装饰视图。帮助我。我在prepareLayout中对装饰视图的计算很好,装饰视图和框架的数量是正确的 (图1)删除前(图2)删除后我没有从任何其他来源得到答案。所以我将根

我通过对
UICollectionViewFlowLayout
进行子分类,将装饰视图添加到
UICollectionView
中。I
m将装饰视图放置在集合视图的每一行下。它工作得很好。装饰视图出现。但问题是,删除一整行项目后,装饰视图不会从集合视图中删除。但是页眉和页脚视图被正确地重新定位了,这不是我处理的。我不知道删除后在何处删除装饰视图。帮助我。我在
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]