使用UICollectionView创建网格布局

时间:2013-10-16 05:35:12

标签: ios objective-c uicollectionview uicollectionviewlayout

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

  1. 包含子行的行
  2. 包含子列的列
  3. 高度可变的行。
  4. 应该可以双向滚动。
  5. 应该可以添加/删除行/列
  6. 我尝试使用收集流程布局,但它开始变得复杂。建立自定义布局对我来说似乎是一个更好的选择。

    我遇到的一些问题: -

    1. 用于存储支持轻松添加/删除行和列的网格信息(仅限布局)的数据结构(基本类层次结构)。
    2. 计算内容视图的高度,前提是行可以是可变大小。
    3. 计算可见矩形内的行范围。现在我收集所有行的高度信息并将它们存储在一个数组中,并进一步计算内容大小的高度。另外,要确定给定rect中的所有行,我必须应用谓词。每次调用“layoutAttributesForElementsInRect”时执行此操作也会在行数为500且仍然可接受时删除fps。
    4. 我尝试为可见行和列维护NSSet布局属性,并在行/列移入和移出时清除/添加属性。但是为可见项创建每个属性的速度要慢得多。哪种设计模式最适合网格?
    5. 最后但不是最不可能用UICollectionView设计类似的东西吗?
    6. 有关如何使用此处理的任何想法,

      谢谢:)

1 个答案:

答案 0 :(得分:3)

所以,我有同样的问题,我已经用这种方式解决了(快速的例子)。

在此示例中,单元格被绘制为平方,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
    }

}