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