1. ホーム
  2. ios

[解決済み] オートレイアウト制約を使用しているときに、ビューの現在の幅と高さを取得するにはどうすればよいですか?

2022-10-17 10:31:28

質問

私はframeプロパティについて話していません、なぜならそこからあなたはxibでビューのサイズを得ることができるからです。私は、ビューがその制約のためにサイズ変更されたときについて話しています(おそらく回転の後、またはイベントに応答して)。その現在の幅と高さを取得する方法はありますか?

私は、幅と高さの制約を探すために制約を反復してみましたが、それはあまりきれいではなく、内在する制約があるときに失敗します (2つを区別できないので)。また、それは実際に幅と高さの制約がある場合にのみ機能し、サイズ変更するために他の制約に依存する場合は機能しません。

なぜ、私にとってこれはとても難しいことなのでしょうか。ARG!

どのように解決するのですか?

答えは [view layoutIfNeeded] .

その理由は以下の通りです。

を検査することによって、ビューの現在の幅と高さを取得することができます。 view.bounds.size.widthview.bounds.size.height (で遊んでいるのでなければ同等です)。 view.transform ).

もしあなたが欲しいものが既存の制約によって暗示される幅と高さであるならば、答えは、制約を手動で検査することではありません。代わりに、あなたがすべきことは、単に そのレイアウトを更新するように自動レイアウトに依頼する で、制約を解決して正しい解決策で view.bounds の値を更新し、それから view.bounds を検査します。

どのように自動レイアウトにレイアウトを更新するように依頼するのでしょうか。コール [view setNeedsLayout] を呼び出すと、自動レイアウトは実行ループの次のターンでレイアウトを更新します。

しかし もし、すぐにレイアウトを更新して、すぐに新しい境界の値にアクセスできるようにしたい場合 をすぐにアクセスできるようにしたい場合は、現在の関数内または実行ループのターン前の別の時点で、を呼び出す必要があります。 [view setNeedsLayout][view layoutIfNeeded] .

高さ/幅の制約を直接参照していない場合、どのように変更することができますか?"。

IB で制約を作成した場合、最良の解決策は、ビュー コントローラーまたはビューで IBOutlet を作成し、制約への直接の参照を持つようにすることです。コードで制約を作成した場合、それを作成した時点で、内部の弱いプロパティで参照を保持する必要があります。他の誰かが制約を作成した場合、ビュー上のview.constraintsプロパティ、および場合によってはビュー階層全体を調べ、重要なNSLayoutConstraintを見つけるロジックを実装することによって、それを見つける必要があります。これは、おそらく間違った方法です。なぜなら、その質問に対する簡単な答えが保証されていない場合、どの特定の制約が境界サイズを決定したかを効果的に判断する必要があるからです。最終的な境界値は、複数の優先順位などを持つ複数の制約の非常に複雑なシステムの解である可能性があり、単一の制約が最終値のquot;cause;quotでないようにすることができます。