tomoyaonishiのブログ

iOSのことを中心に・・・その他もあるよ!

UICollectionViewFlowLayoutAutomaticSizeを使用したCollectionViewの使い方

UICollectionViewFlowLayoutAutomaticSizeを使用したCollectionViewFlowLayoutでUICollectionViewを作ったことがなかったので勉強がてらまとめました。

だいたいありそうなUI構成は問題なくできそうです。UICollectionViewFlowLayoutAutomaticSizeを使いながらも手動でセルサイズを変える方法もみつけました。

contentView自体の大きさを決めてしまうとViewDebuggerでみたときにAmbigiousLayoutになっていたり、ハマりどころ多かったですが、UITableViewのやりかたと同じ要領でやればいいだけでした。。

layout.invalidateLayout()を、viewWillLayoutSubviewsで呼びたかったのですが、Cellの中のviewが更新されるタイミングなのかスクロール中にviewWillLayoutSubviewsが何度も呼ばれてしまって、無限ループになってしまう問題に直面しました。viewWillLayoutSubviewsでinvalidateしないほうがいいのか、Cellの構成が間違っているのか。。

これはこういうもんだった。willDisplayCellあたりでセルのレイアウトが走るからでした。

あと、よくない制約の貼り方でセルの大きさを決められないとき、以下のワーニングが出ます。ログの通り、セルが表示されなかったり、無限ループになったりして面倒でした。 1つずつセルをみていって、解消するしかないです。

CollectionViewMaster[39946:2565272] The behavior of the UICollectionViewFlowLayout is not defined because:
2018-06-24 14:11:24.247596+0900 CollectionViewMaster[39946:2565272] the item width must be less than the width of the UICollectionView minus the section insets left and right values, minus the content insets left and right values.
2018-06-24 14:11:24.247730+0900 CollectionViewMaster[39946:2565272] Please check the values returned by the delegate.
2018-06-24 14:11:24.247976+0900 CollectionViewMaster[39946:2565272] The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fe0f0c17e50>, and it is attached to <UICollectionView: 0x7fe0f102ca00; frame = (0 0; 414 736); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x604000245700>; layer = <CALayer: 0x60400023dfe0>; contentOffset: {0, -64}; contentSize: {414, 8990}; adjustedContentInset: {64, 0, 0, 0}> collection view layout: <UICollectionViewFlowLayout: 0x7fe0f0c17e50>.
2018-06-24 14:11:24.248337+0900 CollectionViewMaster[39946:2565272] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.

ソースコードはこちら。

github.com