2013-10-16 92 views
2

我想構建一個類似於網格的集合視圖佈局。與使用UICollectionView創建網格佈局

  1. 含有行子行含有亞列
  2. 行具有可變高度
  3. 列。
  4. 滾動應該可以在兩個方向上進行。
  5. 它應該是可以添加/刪除行/列

我使用回收流佈局嘗試,但它開始變得複雜。構建自定義佈局似乎是更好的選擇。

面臨了我幾個問題: - 存儲網格信息

  1. 數據結構(基礎類層次)(只佈局)支持的行和列的簡單的添加/刪除。
  2. 考慮到行可以是可變大小,計算內容視圖的高度。
  3. 計算將位於可見矩形內的行範圍。現在我要收集所有行的高度信息並將它們存儲在一個數組中,並進一步計算內容大小的高度。同樣爲了確定哪些行位於給定矩形內,我必須應用一個謂詞。如果對「layoutAttributesForElementsInRect」的每次調用都這樣做,當no行數超過500時仍然可以接受fps。
  4. 我嘗試維護可見行和列的佈局屬性的NSSet,並在行/列移入和移出時清除/添加屬性。但是創建可見項目的每個屬性的速度會更慢。另外什麼設計模式最適合網格?
  5. 最後但並非最不重要的是有可能用UICollectionView設計這樣的東西嗎?

關於如何使用這個程序有任何想法,

謝謝:)

回答

3

所以,我有你同樣的問題,我已經以這種方式(例如SWIFT)解決。

在此示例中,單元格繪製爲平方,2列x N行。

class CustomViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 

    @IBOutlet var collectionView: UICollectionView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     collectionView.delegate = self; 
     collectionView.dataSource = self; 
    } 

    //MARK: - Collection view flow layout delegate methods - 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
     let screenSize = UIScreen.mainScreen().bounds 
     let screenWidth = screenSize.width 
     let cellSquareSize: CGFloat = screenWidth/2.0 
     return CGSizeMake(cellSquareSize, cellSquareSize); 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { 
     return UIEdgeInsetsMake(0, 0, 0.0, 0.0) 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { 
     return 0.0 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { 
     return 0.0 
    } 

}