目标:我有一个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()中获得宽度和高度。
对我有任何暗示吗?非常感谢你前进!
答案 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()
同样,给集合视图一个顶部和底部约束,如果你不能给它一个高度约束,那么改变底部约束也是有效的。
我还没有尝试使用该代码但请告知我是否有效:)