【Swift】パーツのレイアウトがうまくいかない

コードでラベルやボタンを設定する場合、思い通りにいかないことがあります。viewDidLoadでラベルやボタンの位置を設定するとよく起こると思います。その場合の対策を説明します。

目次

対策方法 その1

この不具合の対策として、ラベルやボタンの位置設定をviewDidLayoutSubviewsで行うことが知られています。viewWillAppearでAutoLayoutによるレイアウトが確定されるので、viewWillAppearの次のviewDidLayoutSubviewsで設定すればOKです。そしてviewDidLayoutSubviewsからprivate lazy var initViewLayoutをつないで一度だけ実行します。

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        _ = self.initViewLayout
    }

    private lazy var initViewLayout : Void = {  
        //起動後に一度だけ実行される。
        //ここでラベルやボタンの位置を設定する。
    }

対策方法 その2

上述の方法が正しい処理と思いますが、private? lazy? var? initViewLayout?と、難解なコードを使うことになります。(著者の技術レベルでは難しいんです。ごめんなさい)

難解なコードが嫌ならば、インスタンス変数を一つだけ使って一度だけ実行させるという方法があります。

     gDidLayoutSubviews:Bool = true  //classの下にインスタンス変数を記述します。

     override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

    if gDidLayoutSubviews {
            gDidLayoutSubviews = false

            //起動後に一度だけ実行される。
            //ここでラベルやボタンの位置を設定する。

        }
    }

シンプルで分かりやすいと思いますが素人っぽいコードです。

最後に

他にも色々な方法があると思います。個人アプリ作家であれば、自分で分かりやすいコードを使うのがよいと思います。

コメント

コメントする

CAPTCHA


目次