2015-04-29 82 views
9

我有一個CollectionView有6個部分。在UICollectionView中放置兩個彼此相鄰的部分

第一部分組織爲。第2節& 3是事情變得困難的地方。 我需要將兩個部分緊挨着放在一起

[................第1節..............] //一排有幾排
[ ...第2節...] [...第3節...] //第一個下面的兩個部分

我不能將第二部分分成兩列,因爲這些部分填充不同的單元格。
知道流佈局總是填充一個區域從邊界到邊界,我只能通過將兩個單元格放置在彼此旁邊來僞造這種效果,這很好,但我添加了單元格,而且我只能將一個單元格放置在另一個單元格之下每當我在cellForItemAtIndexPath中創建一個新的單元格時,就會增加一個整數,然後用它乘以單元格的高度。

我面臨的唯一問題是當我重新使用一些單元格時,整數變量hack不再工作。

那麼除了自定義佈局外,還有一種更好的方法可能不會把兩個部分放在一起?

在此先感謝

+0

那麼你可以簡單地使用兩個不同的滾動視圖。但這樣做很糟糕,因爲它避免了一個更清晰的解決方案,它將「正確使用自定義佈局和自定義單元格」 –

+2

您的需求似乎與本文檔第18頁上給出的自定義佈局示例相匹配。 https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CollectionViewPGforIOS.pdf –

+0

太棒了!所以我錯了,假設一個自定義的佈局不能完全做到這一點!謝謝 – maxlxb

回答

1

您不必編寫自定義佈局,可以真正地繼承UICollectionViewFlowLayout並覆蓋確定幀定位的幾個關鍵方法,即layoutAttributesForElementsInRect:/layoutAttributesForItemAtIndexPath:在那裏你可以檢查部分並確定職位。

代碼本身可能會是比較簡單的,沿着線的東西:

if indexPath.section == 0 { 
    attributes.frame = CGRect(x: 0, y: 0, width: fullWidth, height: someHeight) 
} else { 
    // Section 2 which is indexed at 1, set the frame 
    // to half the width and x to 0 
    if indexPath.section %2 != 0 { 
     attributes.frame = CGRect(x: 0, y: someYCounter, width: halfWidth, height, someHeight) 
    } else { 
     attributes.frame = CGRect(x: halfWidth, y: someYCounter, width: halfWidth, height, someHeight) 
    } 
} 

顯然,這是僞代碼,我沒有經歷過一個編譯器運行這一點,但基本步驟是:

  • 具有確保集合視圖的存在,所以你可以定義以下變量的防護聲明:(後來鋪設時使用)halfWidthfullWidth
  • 讓您的y位置
  • 檢查的部分指標,並適當地

位置去這是重寫prepare和計算佈局的陣列屬性的最佳方式運行計數器(並存儲爲一個實例變量)。然後在layoutAttributesForItemAtIndexPath:之類的,只返回對象數組中的索引(或者,如果該指數是出於某種原因出界,返回super.layoutAttributesForItem(at: indexPath)

這是UICollectionViewFlowLayout美麗,最繁重的任務是爲你完成,你可以繼承幾個簡單的方法來獲得所需的行爲。另一種選擇是全面的自定義佈局,在我看來,除非您有一些瘋狂的行爲,否則您應該與設計師就他們所做的複雜性進行對話,這是很少有理由的。

+0

感謝您的評論。這似乎是一個更簡單的方法,只需要進行佈局更改,這將大大減少'cellForItemAtIndexPath:'實現以及整個viewController實現,並且它不需要我實現一個自定義佈局,這是此問題的重點;因此我接受了答案。 – maxlxb