iOS 13から登場した以下の方法
※今回 _
にしているが、実際の値は(sectionIndex, environment)
self.collectionView.collectionViewLayout = UICollectionViewCompositionalLayout { _, _ in // セルの高さ let cellHeight: CGFloat = 54.0 // セルの上下左右共通の隙間の大きさ let cellSpacing: CGFloat = 5.0 let height = LanguageSelectListViewController.cellHeight // サイズとレイアウトアイテムを作成 let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(height)) // ここで高さを指定 let item = NSCollectionLayoutItem(layoutSize: itemSize) // グループを作成 let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(height)) // ここで高さを指定 let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) // セクションを作成 let section = NSCollectionLayoutSection(group: group) section.interGroupSpacing = spacing section.contentInsets = NSDirectionalEdgeInsets(top: spacing, leading: spacing, bottom: spacing, trailing: spacing) return section }
ただしその方法をすると
UICollectionViewDelegateFlowLayout
のdelegateが動かない。
以下をすると、
override func viewDidLoad() { super.viewDidLoad() let flowLayout = UICollectionViewFlowLayout() collectionView.collectionViewLayout = flowLayout collectionView.collectionViewLayout.collectionView?.delegate = self }
いかが呼べる
extension MyViewController: UICollectionViewDelegateFlowLayout { // このデリゲートメソッドを実装 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { if indexPath.section == 0 && indexPath.item == 2 { return CGSize(width: collectionView.frame.width, height: 200) } return CGSize(width: collectionView.frame.width, height: 100) } }