2012-10-12 18 views
15

UICollectionView裝修和補充意見似乎是一個很大的謎。目前似乎沒有示例代碼。我設法讓這兩種類型在自定義佈局中工作(有關詳細信息,請參閱此post)。只要他們保持在同一位置,一切都很好(即如果他們的layoutAttributes.frame不會改變)。UICollectionView裝修和補充意見不能移動

但是,只要我修改layoutAttributes對裝飾或補充視圖進行重新佈局,它們就會在視覺上被複制 - 即在其原始位置有一個副本,而在其新位置有副本。如果我從XIB實例化它們或完全在代碼中並且行爲不會發生在正常單元格中,則行爲是相同的。

起初我以爲這是一種重繪問題,但這些「副本」生存重新佈局,重繪等,但他們不是真正的副本,因爲layoutAttributesForDecorationView等從未要求他們(只爲新的地點)。在UICollectionView的背景中似乎有一些緩存。

有沒有人得到這個工作或有任何想法。我必須說我是iOS平臺的新手,所以它也可以是簡單的事情,比如設置「Clips Bound」或「Clear Graphics Context」屬性(我嘗試過,但可能類似)。

這讓我很瘋狂,奇怪的是這裏絕對沒有示例代碼。

我在問自己:裝修和補充意見是不是要重新定位? (我不希望)

+0

和你一樣的問題。我不重新定位它們,但是在集合視圖上執行批量更新時它們將被複制。 – YuAo

+0

只是FYI它不會出現,如果你不調用performBatchUpdates,或者如果你不使用CollectionView的moveItem,deleteItem或insertItem。但你放棄任何動畫... – foOg

+0

我看到同樣的事情 - 但只重新加載數據,而不是在做重新佈局時。我在自定義單元格中實現了-prepareForReuse以清除所有內容,但仍然看到重複的數據(新數據重疊在舊的數據上)。 – StephenT

回答

1

我有同樣的問題。 這似乎是與UICOllectionview有一些錯誤(這不是我看到的第一個)。 我通過不使用「performBatchUpdates」來修復它。 我失去了動畫 - 但在列表中沒有不需要的視圖。

0

我認爲蘋果將至少在裝飾視圖的情況下表明它們按預期工作。我遇到了同樣的問題,因爲我正在重新調整最後一部分,並試圖設置裝飾視圖,以便在它們更改時圍繞這些部分。剛開始使用一個簡單的視圖,只是有一個紅色的背景,我的應用程序的整個背景變成紅色,這使我困惑。隨後,我將裝飾視圖的佈局屬性上的阿爾法值更改爲0.3f,並且隨着部分更改,我可以看到它們彼此層疊。

真正放倒我了,這可能是由設計,雖然是一條線我的教程UICollectionView

在另一方面看,裝修意見「觀賞性」,而不是 數據驅動的:想想iBooks應用程序中的書架背景。

關鍵是裝飾視圖不是數據驅動的,不應該隨着數據的變化而改變,不管你是否能夠在自定義佈局中做到這一點。就像書架的情況一樣,貨架的尺寸在創建後不會改變。

10

嗨,這是一個古老的問題,但有一個答案。

實際上,當我實現自己的佈局對象時,我也遇到了這些問題,直到我意識到緩存您在自定義佈局中創建的任何佈局屬性對象是必要的。在文檔中實際上有一個非常模糊的參考(我現在不記得確切的位置),這很容易被誤解。

基本上,一旦您爲索引路徑中的某個單元格請求了layoutAttributes對象,您應該保留屬性對象(例如,將它保留在字典中的索引路徑作爲鍵將執行)並返回相同的屬性對象任何和所有後續的屬性請求。如果您不這樣做,而是重新創建新的佈局屬性,批量更新的動畫會導致嚴重的圖形故障和人工製品。

+3

如果集合視圖使用'isEqual'來比較'UICollectionViewLayoutAttributes'實例,則通過深度比較覆蓋'isEqual'可以解決問題,而不必保留對象。 –

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與類的可重複使用的觀點正被留在屏幕。

希望這可以幫助別人。

0

我有類似的症狀。我的問題是,在創建我的自定義佈局時,我不小心將補充視圖的reuseID而不是kindID

具體來說,我有這個(錯誤

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

當我應該有這個(

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

這意味着prepareForReuse是從來沒有得到所謂的,我的舊觀點永遠不會離開。相反,他們一直在堆積。