【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があがるにつれて推測能力(?)あがってんだろうな┐(´-`)┌ 進化を感じる

 

ではでは。

2018/04/13追記
AutoLayout無理・・・
Swift , ,
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

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

Related Memo...

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS
more