16

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

但是,一旦我重新布局并更改layoutAttributes了装饰或补充视图,它们就会在视觉上重复 - 即在其原始位置的背景中有一个副本,在他们的新位置有一个副本。如果我从 XIB 或完全在代码中实例化它们,则行为是相同的,并且对于正常单元格不会发生该行为。

起初我认为这是某种重绘问题,但这些“副本”在重新布局、重绘等后仍然存在。然而,它们不是真正的副本,因为layoutAttributesForDecorationView它们从来没有被调用过(仅适用于新位置)。在后台似乎有一些缓存UICollectionView

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

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

我在问自己:装饰和补充观点不是要重新定位吗?(我希望不是)

4

5 回答 5

12

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

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

基本上,一旦您为索引路径中的单元格请求了 layoutAttributes 对象,您应该保留属性对象(例如,将其保留在字典中,索引路径作为键)并为任何和所有后续返回相同的属性对象属性请求。如果您不这样做,而是重新创建新的布局属性,批量更新的动画会导致严重的图形故障和伪影。

于 2013-05-12T21:58:58.360 回答
1

我遇到过同样的问题。UICOllectionview 似乎存在一些错误(这不是我第一次看到)。我通过不使用“performBatchUpdates”来修复它。我失去了动画 - 但在列表中没有不需要的视图。

于 2012-11-27T11:55:31.290 回答
1

我有类似的症状。我的问题是我在创建自定义布局时不小心包含了补充视图的重用ID而不是kindID 。

具体来说我有这个(错误

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

当我应该拥有这个(

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

这意味着 prepareForReuse 永远不会被调用,我的旧观点也永远不会消失。相反,他们一直在堆积。

于 2016-04-21T22:32:04.880 回答
0

I think Apple is going to indicate at least in the case of Decoration views that they are working as intended. I ran into this same problem as I was re-sizing the last section and trying to setup the Decoration view to surround the sections as they changed. Using a simple view at first that just had a red background the entire background of my app became red and this confused me. I subsequently changed the alpha to 0.3f on the layout attributes of the decoration views and I was able to see them layer upon each other as the sections changed.

What really tipped me off that this might be by design though was a line I read in a tutorial on UICollectionView

On the other hand, decoration views are “ornamental” rather than data-driven: think of the bookshelf backdrop in the iBooks app.

The key is that Decoration Views aren't data-driven and shouldn't be changing as your data changes regardless of if you being able to do this in the custom layout. Like in the case of a bookshelf the size of the shelves don't change after they've been created.

于 2013-02-21T16:25:55.863 回答
0

我知道这是一个老问题,但是当使布局无效时,补充视图在各处重复出现问题时,我遇到了这个问题。我相信这是一个错误,我通过覆盖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];
        }
    }
}

替换UICollectionReusableView为留在屏幕上的可重用视图的类。

希望这可以帮助某人。

于 2013-06-20T08:50:05.187 回答