問題
[iOS] AutoLayout使用時の注意点
AutoLayout使用時、view.frameはViewWillLayoutSubViews以降で取得する
AutoLayoutを使用した場合、Frameが決定されるのがviewWillAppear後のため、
初期化処理をviewDidLayoutSubviewsに記載する必要がある。
しかし、viewDidLayoutSubviewsは何度も呼ばれるメソッドのため、
普通に書くと何度も呼ばれてしまう。
対処法
lazy
を使う。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
_ = self.initViewLayout
}
private lazy var initViewLayout : Void = {
print(self.view.frame)
}()
呼び出し時に初めて初期値がセットされるlazy
を利用して初期化する。
(サンプルコード見てて、こういう記法があることを初めて知った笑)
こう書くことで、viewDidLayoutSubViewsにてinitViewLayoutという変数が呼ばれ、
初回呼び出し時に定義されるため、 {} で記述した中身が実行される。
初回以降の呼び出しでは中身が定義されずVoidを返すだけになる。(で、あってるかな…。)
参考
PageControl/ViewController.swift
Demonstrates how to use a
コメント