Swift:让UICollectionView动态改变其大小

时间:2017-04-25 10:26:34

标签: ios swift uicollectionview uicollectionviewcell

目标:我有一个UICollectionView,默认7列和6行单元格。现在,用户可以通过UIStepper更改列数和行数。像这样:

var numberOfColumns: Int = 7

@IBAction func changeNumberOfColumns(_ sender: UIStepper) {
    numberOfColumns = Int(sender.value)
    boardSizingCollectionView.reloadData()
}

extension BoardSizingViewController: UICollectionViewDataSource {

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return numberOfRows
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return numberOfColumns
    }

    func collectionView(_ collectionsiView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Field", for: indexPath) as! FieldCollectionViewCell
        cell.tokenView.backgroundColor = .white
        cell.tokenView.layer.cornerRadius = (cell.frame.width - 8 * 2) / 2
        return cell
    }
}

单元格应保持其大小,而不应调整UICollectionView的大小。

问题:我无法在代码中直接设置UICollectionView的宽度和高度,因为这些是get-only属性。如果我使用

boardSizingCollectionView.frame.size = CGSize(width: FieldCollectionViewCell.frame.width * numberOfColumns, height: FieldCollectionViewCell.frame.height * numberOfRows)

我收到错误,因为我的FieldCollectionViewCell是一个CGRect,我不知道如何准确访问CGRect的大小。

肉体中的另一个钩子是,myCollectionView对其x和y位置有约束,可以自动定位在不同的设备上,因此myCollectionView必须至少在viewDidLoad()中获得宽度和高度。

对我有任何暗示吗?非常感谢你前进!

2 个答案:

答案 0 :(得分:0)

您无法直接修改frame。但是,您可以为问题指定一个新框架。

  

我无法直接设置UICollectionView的宽度和高度   代码,因为这些是get-only属性。如果我使用

    //get the current frame
    var collectionViewFrame = self.collectionView.frame 
    //set the size
    collectionViewFrame.size = CGSize(width: FieldCollectionViewCell.frame.width * numberOfColumns, height: FieldCollectionViewCell.frame.height * numberOfRows) 
    //again set the frame
    self.collectionView.frame = collectionViewFrame

答案 1 :(得分:0)

也许尝试一种不同的方法来约束故事板中的集合视图,这样您就可以通过约束来改变高度。一种方法是给它一个高度约束,并将插座连接到视图控制器。这样你可以做到

collectionViewHeightConstraint.constant = 
  FieldCollectionViewCell.frame.height * numberOfRows

collectionView.layoutIfNeeded()
collectionView.reloadData()

同样,给集合视图一个顶部和底部约束,如果你不能给它一个高度约束,那么改变底部约束也是有效的。

我还没有尝试使用该代码但请告知我是否有效:)