うるおいらんど

アプリ開発やサイト制作のメモとか。

【Swift3】UICollectionViewFlowLayoutの設定でループに入ってクラッシュする時【可変セル】

魚ライン
魚ライン

これだ!っていう解決策ではないですが、確認することメモメモです。

UICollectionViewで左寄せの可変セルを実装しようとしていました。

UICollectionViewFlowLayoutはサブクラスを作って、「UICollectionViewでタグが左寄せに並んでいるようなレイアウトを実現する -Qiita」をそのまま使わせていただき実装。

可変セルは、xibを用いてAutoLayoutを設定し、実装。

しかし何故かiOS9でのみ無限ループに陥ってクラッシュ。(iOS10,iOS11ではちゃんと動く)

 

最初の1つ目はサイズの計算ができているんですが、2つ目以降は計算ができないのか、そこで落ちてしまいます。

色々調べてたどり着いたのがこちら

UICollectionView self-sizing-cell on iOS 8 will crash with UIDynamic flowLayout and repeating call to _updateVisibleCellsNow –

 

ここの回答に、

1. Before self-sizing cell

2. Validated self-sizing cell again after other cells recalculated.

3. Did changed self-sizing cell

If second steps can’t get stable all cells’ position and size, it will become infinite loop.
と書かれていまして。まさしくこれだー

つまりはAutoLayoutが上手くできてないから再計算できないぞ!!ってことです。

 

なのでAutoLayoutあたりをとにかく確認してみました。

その時セル上のラベルについていた制約が、

・縦横それぞれの真ん中に来るやつ

・上下左右のmarginを固定

でした。

コード上ではestimatedItemSizeを書いておいて、これでiOS11とiOS10ではなんの問題もなく動いていました。

iOS10ではレイアウト変えるときにcollectionViewLayout.invalidateLayout()を呼んでないとクラッシュすることがあるので書いてあります。具体的にはreloadDataをした後です。この件に関しては、【Swift3】UICollectionViewで「Assertion Failure in [UICollectionViewData:invalidateItemsPaths] ~~」が出たときの対処にも書いてまする。

 

AutoLayoutに関しては、約2年前に最初にiOS開発を始めたときに技術書読んで使った以来ほぼ使っていなかったので、その時の知識だけでやっている初心者です。

なのでもうね〜〜〜よくわからんけどいじってみるしかないな〜ってことで色々いじってはビルドして落ちて、何故か急に落ちなくなったと思ったらセル5つくらいで落ちて????ってなってを繰り返しまして。

もう投げようとした矢先に急に落ちなくなった。わけがわからん。

結局最終的にセル上のラベルについていた制約は、

・Y軸の中心にくるやつ(X軸の方を外した)

・上下左右のマージン

・width >= 10

で動くようになりました。

んでこれで動くようになったわけなんですが、なんか知らんが可変じゃなくなったんですよね。もう本当にわけがわからん。

結局、そのラベルに合わせてセルの方をIB上で縮めてやったら可変になりました。謎い

■[■■ラベル■■]■ となっていたのを

■[ラベル]■にしてやっただけなんですけどね。■は空白ですよ。

 

とにかく無限ループに陥ってどうやらは、恐らくAutoLayoutが上手くいってないので確認してみてね!ってことです。

collectionViewLayout.invalidateLayout()もリロード後に書いてあるので、それも必要かもしれないです。確認はしてないですけど。

 

しかし本当にわけわからんでござる。OSがあがるにつれて推測能力(?)あがってんだろうな┐(´-`)┌ 進化を感じる

 

ではでは。

魚ライン
モッピー!お金がたまるポイントサイト
魚ライン

Swiftの記事一覧を見る

コメント

コメントは認証制です。詳しくは下記の注意をお読みください。

コメントを残す

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

魚ライン 魚ライン