【Swift4】【autoLayout】レイアウトが決まってからの変更処理のタイミング

「autoLayoutってなんじゃー!つかいもんにならんわー!」
と、そんなふうに思っていた時期が僕にもありました。(笑)

使い慣れてみるとケッコー便利です。\(^o^)/

さて、そんな便利なautoLayoutですが、一つ困ったことが。
画面のサイズが決定して、それをもとに%などでサイズが決まって形状を変えたいときなどどの段階で処理するかが問題なのです。

viewControllerで描画に関連しそうなメソッドのライフサイクルはこんな感じかな?

さて、autoLayoutでのレイアウトが決定しているのがviewDidLayoutSubviews以降です。
それ以前は値が決定しておらず、autoLayoutで決まる値を参照にするとおかしなことになる可能性が高いです。

viewDidLayoutSubviewsを知る前はviewDidAppearにその処理を書いていました。
しかし、ビューが描画されたあとなので、一瞬描き変えられるところが見えたりします。/(^o^)\

また、毎回他のビューから戻ってきてビューが表示されるたびに同じ処理を繰り返してしまいます。
レイアウトが決まってビューが表示される直前のviewDidLayoutSubviewsなら描き変えられるところは表示されませんが、
こちらはビューの切り替わりだけでなくビューが回転したりイベントあるたびに呼ばれてしまうようです。

で、本題。
結局やりたいのはviewDidLayoutSubviewsで一回だけ処理をさせるということ。
いろいろと調べてこちらのサイトが参考になりました。

[Swift] viewDidLayoutSubviewsで初回だけ処理をしたい | 黒ごまのおむすび

Lazyというのをつかうらじいです。/(^o^)\

この処理だとビューの表示前に一回だけ呼び出すことができました。
他の人はこんな場合どうしているんだろう?
うじゃうじゃ。/(^o^)\

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">