web-dev-qa-db-ja.com

autolayout制約がView Controllerのライフサイクル中にフレームを設定するのはいつですか?

ストーリーボードの自動レイアウト制約を使用しました。ただし、サブビューの動的な高さを計算したい場合があります。これをviewDidAppear()でコーディングします。このメソッドは、すべてのビューフレームがレイア​​ウト制約によって設定された後に呼び出されるため、正常に機能します。ここでの問題は、制約によって設定されたフレームを0.5秒間見ることができることです。そして、コードはビューをリフレームします。

変更できるように制約によってフレームが設定された後に呼び出されるviewDidLayout()について知りました。しかし、それは機能しません。制約が使用される前にこのメソッドが呼び出されるようなものです。

13
Hiren Prajapati

viewDidAppearメソッドは、ビューのライフサイクルの最後に呼び出されます。したがって、ここで制約を変更すると、常に表示されます。

行う変更が1回限りのイベントである場合は、viewWillAppearメソッドで行うことができます。ただし、この時点でビューの描画が常に完了するとは限らないため、これが常に役立つとは限りません。したがって、より良いオプションは、コードをviewWillLayoutSubviewsまたはviewDidLayoutSubviewsに配置することです。

注:viewWillLayoutSubviewsまたはviewDidLayoutSubviewsは、向きの変更、別のビューの内外への移動、フレームの変更など、ビューのライフサイクルで複数回呼び出されますその問題。
ここに追加するコード変更が1回限りのイベントである場合は、必ずフラグを使用してください。

例えば:-

- (void)viewWillLayoutSubviews {    
    if(firstTime) {
        // put your constraint change code here.
    }
}

お役に立てれば! :)

10
GoGreen

名前が示すように、viewDidLayoutSubviewsは、viewControllerのビューのレイアウトが終了したときに呼び出され、その動的な高さで、ビューが自動レイアウトの制約に従って正しい場所/フレームにあると想定できます。

Swift :

    override func viewDidLayoutSubviews() {
       // Set your constraint here
    }

Objective C :

   -(void)viewDidLayoutSubviews {
   // Set your constraint here
   }
4
Anil Kukadeja

viewDidLayoutSubviews()で実際に何をしようとしているのかわかりません。私は常に、このメソッドをオーバーライドするレイアウト制約値を変更してビューをカスタマイズするために使用します。

    // Called to notify the view controller that its view has just laid out its subviews
    override func viewDidLayoutSubviews() {
        //Write your code here, any constraint modification etc.
       super.viewDidLayoutSubviews()
    }
0
Sauvik Dolui