CollectionViewで1行あたりのセルの数を指定したかったので調べました。
何も指定せずに表示した場合
こんな感じに表示されました。
どうやらセル間のスペースやサイズがデフォルトの値になっているので、セルのサイズやスペースを調整すると任意の数が表示できそうです。
1行あたりのセルの数を4個にしてみる
とりあえず、例として1行あたりのセルの数を4個表示するのをゴールに設定

セルの数を指定するコード
引数number
に1行あたりに表示したい数字を入れると、希望のセル数が表示される関数を作ってみた。
private func numberOfItemsInRow(_ number: CGFloat) {
let layout = UICollectionViewFlowLayout()
let width = self.view.frame.size.width / number
let height = width
layout.itemSize = CGSize(width: width, height: heigh)
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 0
collectionView.collectionViewLayout = layout
}
解説
UICollectionViewFlowLayout()
let layout = UICollectionViewFlowLayout()
UICollectionView
のセルのitemSize
等がプロパティとして用意されているオブジェクトUICollectionViewFlowLayout
をインスタンス化。
これを調整していってセルのサイズを決めていきます。
itemSize
let width = self.view.frame.size.width / number //引数number
let height = width
layout.itemSize = CGSize(width: width, height: heigh)
アイテム一個あたりのwidth
をself.view
の横幅を表示させたい数で割る。
height
は今回はアイテムを正方形にしたかったのでwidth
と同じ値にしています。
セルの大きさを決めるitemSize
にwidth
とheight
を代入
Spacing
上記のコードだけだと4個表示させたいのに希望通りの数が表示されませんでした。
スペースの大きさを考慮していなかったのが原因だった為、スペースの大きさを0にします。
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 0
minimumLineSpacing
は下辺のスペース、
minimumInteritemSpacing
はセル同士の間のスペース
この二つのプロパティに0を代入して、スペースを無くしました。
UICollectionViewLayout
UICollectionView
には、セルのサイズや余白等のレイアウトを管理するためのプロパティとしてUICollectionViewLayout
が用意されています。
そのUICollectionViewLayout
に作成したレイアウトを代入すると完成です。
collectionView.collectionViewLayout = layout
最後に作った関数を呼び出す
あとは、作った関数に引数を代入して呼び出して終わり。
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView!.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier)
//1行あたり4個表示させる
numberOfItemsInRow(4)
}
まとめ
今回はセル間のスペースを無しにしましたが、セル間のスペースを入れて希望の数を表示させたい場合は、self.view.frame
の横幅に対しての一個あたりのセルの横幅だったり、minimumInteritemSpacing
あたりを調整すると良さそうです。
何か間違いやより良い方法がありましたら、優しく教えていただけましたら幸いです🙇♂️