【Swift】レイアウトがずれる。【AutoLayout】追記あり。

原因が分かってからネットを検索すると情報はいっぱい出てくるんですけどね。
原因にたどり着くまでが長かった。orz
忘れると困るので備忘録。

参考サイト
http://rindatetu.hatenablog.jp/entry/2016/03/06/154946

症状としてはStoryboardでAutoLayoutで指定したスクロールビューがおかしい。
機種(画面サイズ)によって位置がずれる。

結果的にはAutoLayoutで指定したビューを元にviewDidLoadメソッドで更に描画指定をしようとしたからずれたようだ。

自分が理解しているviewControllerのライフサイクルは以下のような感じ。

・viewDidLoad
最初に一回だけ呼ばれる。
初期設定とか何でも放り込みがちだよね。

・viewWillAppear
開くたびに呼ばれる。
他の画面で設定したものを毎回画面に来る度に反映させたいときなどにつかう。

・viewDidAppear
画面の表示、レイアウトが終わった所で呼ばれる。

・viewWillDisappear
他の画面に遷移する直前に呼ばれる。

・viewDidDisappear
他の画面に遷移したあとに呼ばれる。

今回はAutoLayoutの処理が終わったあとに更に描画処理をする必要があったため、viewDidAppearに処理を書くことで対処できた。
しかし気づくまでに3日もかかったとか…。orz

追記
さらにその後問題が見つかった。
viewDidAppearにレイアウトの処理を書くと、毎回開くたびにレイアウトがやり直される。
今回はscrollViewで電子書籍風のページを作ったが、別のviewに行って戻ってくると最初のページに戻ってしまう。

この問題の解決方法がこちら
参考サイト
[Swift] viewDidLayoutSubviewsで初回だけ処理をしたい | 黒ごまのおむすび

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    _ = self.initViewLayout
}

private lazy var initViewLayout : Void = {
    print(self.view.frame)
}() 

よくわからないが lazy というのあり、これを使うと
初回一回のみの処理となるらしい。

まだよく理解できてないが、一応思ったとおりの動作になったので良しとしよう。
うじゃうじゃ。

コメントを残す

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