UICollectionView装饰和补充意见不能被移动

UICollectionView装饰和补充意见似乎是一个很大的谜。 目前似乎没有示例代码。 我设法让这两种types在自定义布局中工作(请参阅这篇文章的一些细节)。 只要他们保持在相同的位置,一切都很好(即如果他们的layoutAttributes.frame不会改变)。

然而,只要我改变layoutAttributes为装饰或补充意见,他们得到视觉复制 – 即有一个在他们的原始位置的背景和副本在他们的新位置副本。 如果我从XIB实例化它们或完全在代码中并且行为不发生在正常单元格中,则行为是相同的。

起初,我认为这是一种重绘问题,但这些“副本”生存重新布局,重绘等,但他们不是真正的副本,因为layoutAttributesForDecorationView等从未被调用(只为新的位置) 。 在UICollectionView的背景中似乎有一些caching。

有没有人得到这个工作或有任何想法。 我必须说我是iOS平台的新手,所以它也可以是简单的事情,如设置“剪辑绑定”或“清除graphics上下文”属性(我尝试过,但可能是类似的东西)。

这让我疯狂,奇怪的是,那里绝对没有示例代码。

我在问自己:装修和补充意见是不是要重新定位? (我希望不是)

嗨,这是一个老问题,但有一个答案。

其实我也有这些问题,当我实现我自己的布局对象,直到我意识到,必须caching您的自定义布局中创build的任何布局属性对象。 在文档中实际上有一个非常模糊的引用(我现在不记得确切的位置),这很容易被误解。

基本上,一旦你在一个索引path上为一个单元格请求了一个layoutAttributes对象,你应该保留这个属性对象(例如,将它保留在字典中,索引path作为一个键将执行),并返回任何和所有后续的相同属性对象请求属性。 如果您不这样做,而是重新创build新的布局属性,批量更新的animation会导致严重的graphics故障和人工制品。

我遇到过同样的问题。 看起来UICOllectionview有一些错误(这不是我看到的第一个错误)。 我通过不使用“performBatchUpdates”来修复它。 我失去了animation – 但在名单上没有不必要的看法。

我认为苹果至less会在装饰的意见中指出,他们正在按预期工作。 我遇到了同样的问题,因为我正在重新调整最后一个部分,试图设置装饰视图,以便在它们更改时包围这些部分。 刚开始使用一个简单的视图,只是有一个红色的背景,我的应用程序的整个背景变成红色,这使我困惑。 随后,我将装饰视图的布局属性上的阿尔法值更改为0.3f,并且随着部分的更改,我可以看到它们彼此层叠。

什么真的让我失望,这可能是由devise,虽然是我在UICollectionView教程阅读的一行

另一方面,装饰视图是“装饰性”而不是数据驱动的:想想iBooks应用程序中的书架背景。

关键是装饰视图不是数据驱动的,不应该随着你的数据改变而改变,不pipe你是否能够在自定义布局中做到这一点。 就像在书架的情况下,货架的大小在创build后不会改变。

我知道这是一个古老的问题,但是当我在布局无效的情况下遇到补充视图重复出现的问题时,我碰到了这个问题。 我相信这是一个错误,我通过在layout对象中使用invalidateLayout来修复它,并删除如下的补充视图:

 - (void)invalidateLayout { [super invalidateLayout]; // Manually remove all suplementary views of a certain type /** ** This appears to be a BUG. Invalidate view does not remove suplementary view ** from the view hierachy. But they are Orphaned so stay on screen. **/ for (UIView *subview in [self.collectionView subviews]) { if ([subview isKindOfClass:[UICollectionReusableView class]]) { [subview removeFromSuperview]; } } } 

UICollectionReusableViewreplace为屏幕上剩余的可重用视图的类。

希望这有助于某人。

我有类似的症状。 我的问题是,当创build我的自定义布局时,我不小心包含了补充视图的reuseID而不是kindID

具体来说,我有这个(

 UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:myViewReuseID withIndexPath:sectionIndexPath]; 

当我应该有这个(

 UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:myViewKindID withIndexPath:sectionIndexPath]; 

这意味着prepareForReuse从来没有被召唤,我的旧观点从未消失。 相反,他们一直在堆积。