答えは[view layoutIfNeeded]
です。
理由は次のとおりです。
あなたはまだ検査することで、ビューの現在の幅と高さを取得view.bounds.size.width
してview.bounds.size.height
(またはあなたが演奏している場合を除き同等であるフレーム、view.transform
)。
必要なものが既存の制約によって暗示されている幅と高さである場合、それらを解釈するために自動レイアウトシステムの制約解決ロジック全体を再実装する必要があるため、答えは制約を手動で検査することではありません。制約。代わりに、自動レイアウトにレイアウトの更新を依頼するだけで、制約が解決され、view.boundsの値が正しいソリューションで更新され、view.boundsが検査されます。
自動レイアウトでレイアウトを更新するにはどうすればよいですか?[view setNeedsLayout]
自動レイアウトで実行ループの次のターンでレイアウトを更新する場合は、呼び出します。
ただし、レイアウトをすぐに更新して、現在の関数内で後で、または実行ループのターン前の別の時点で新しい境界値にすぐにアクセスできるようにする場合は、およびを呼び出す必要が[view setNeedsLayout]
あり[view layoutIfNeeded]
ます。
2つ目の質問:「高さ/幅の制約を直接参照していない場合、どうすれば高さ/幅の制約を変更できますか?」
IBで制約を作成する場合、最善の解決策は、ビューコントローラーまたはビューでIBOutletを作成して、直接参照できるようにすることです。コードで制約を作成した場合は、それを作成したときに、内部の弱いプロパティの参照を保持する必要があります。他の誰かが制約を作成した場合は、ビューのview.constraintsプロパティ、および場合によってはビュー階層全体を調べ、重要なNSLayoutConstraintを見つけるロジックを実装することによって、制約を見つける必要があります。これはおそらく間違った方法です。その質問に対する単純な答えが保証されていない場合、境界サイズを決定する特定の制約も効果的に決定する必要があるためです。最終的な境界値は、複数の制約の非常に複雑なシステムの解決策になる可能性があります。