xyk blog

最近は iOS 開発の記事が多めです。

UICollectionView のセルサイズを指定しても反映されない時

検証環境:
Xcode 12.4
Swift 5.3.2

UICollectionView のセルサイズを、

  • UICollectionViewFlowLayout.itemSizeプロパティ
  • またはUICollectionViewDelegateFlowLayoutデリゲートのcollectionView(_:layout:sizeForItemAt:)メソッド

を実装してセルサイズ(CGSize)を指定しても、contentView に張り付けた UIImageView の制約の方が優先されて指定したセルサイズにならない現象が起きた。

原因はどうやら UICollectionViewCell の Self Sizing 機能が有効になり、セル内の AutoLayout の制約に従って自動計算されたセルサイズが優先されるらしい。

これを回避する方法はセルの推定サイズestimatedItemSizeプロパティにデフォルトでUICollectionViewFlowLayout.automaticSizeが指定されているのでこれを 0 に変更すればよい。

コードでやる場合

let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
flowLayout.estimatedItemSize = .zero

または

@IBOutlet weak var flowLayout: UICollectionViewFlowLayout! {
    didSet {
        flowLayout.estimatedItemSize = .zero
    }
}

StoryBoard でやる場合

f:id:xyk:20210216104602p:plain