使用UICollectionView创建网格布局

问题描述:

我想构建一个类似于网格的集合视图布局。与使用UICollectionView创建网格布局

  1. 含有行子行含有亚列
  2. 行具有可变高度
  3. 列。
  4. 滚动应该可以在两个方向上进行。
  5. 它应该是可以添加/删除行/列

我使用回收流布局尝试,但它开始变得复杂。构建自定义布局似乎是更好的选择。

面临了我几个问题: - 存储网格信息

  1. 数据结构(基础类层次)(只布局)支持的行和列的简单的添加/删除。
  2. 考虑到行可以是可变大小,计算内容视图的高度。
  3. 计算将位于可见矩形内的行范围。现在我要收集所有行的高度信息并将它们存储在一个数组中,并进一步计算内容大小的高度。同样为了确定哪些行位于给定矩形内,我必须应用一个谓词。如果对“layoutAttributesForElementsInRect”的每次调用都这样做,当no行数超过500时仍然可以接受fps。
  4. 我尝试维护可见行和列的布局属性的NSSet,并在行/列移入和移出时清除/添加属性。但是创建可见项目的每个属性的速度会更慢。另外什么设计模式最适合网格?
  5. 最后但并非最不重要的是有可能用UICollectionView设计这样的东西吗?

关于如何使用这个程序有任何想法,

谢谢:)

所以,我有你同样的问题,我已经以这种方式(例如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 
    } 

}